/** * Utfør kriminalitet */ public function utfor($id) { $this->options_load(); if (!isset($this->options[$id])) { throw new HSException("Fant ikke ønsket alternativ."); } $krim = $this->options[$id]; $ret = array("success" => false); // treffer vi med sannsynligheten? if (rand(0, 100) <= $krim['prob'] * 100) { // vellykket $ret['success'] = true; // gi penger til spilleren $cash = rand($krim['cash_min'], $krim['cash_max']); \Kofradia\DB::get()->exec("UPDATE users_players SET up_cash = up_cash + {$cash} WHERE up_id = {$this->up->id}"); $ret['cash'] = $cash; // trigger $this->up->update_money($cash, true, false); // gi rank til spilleren $ret['rank_change'] = $this->up->increase_rank($krim['points']); $ret['rank'] = $krim['points']; } // wanted nivå $ret['wanted_change'] = $this->up->fengsel_rank($krim['points'], $ret['success']); // oppdater kriminalitet-status $s = $ret['success'] ? 2 : 1; \Kofradia\DB::get()->exec("\n\t\t\tINSERT INTO kriminalitet_status\n\t\t\tSET krimid = {$id}, ks_up_id = {$this->up->id}, count = 1, success = " . ($ret['success'] ? 1 : 0) . ", last = " . time() . ", ks_strength = ks_strength + {$s}\n\t\t\tON DUPLICATE KEY\n\t\t\tUPDATE count = count + 1, success = success + VALUES(success), last = VALUES(last), ks_strength = VALUES(ks_strength)"); // oppdater kriminalitet \Kofradia\DB::get()->exec("\n\t\t\tUPDATE kriminalitet\n\t\t\tSET k_strength = k_strength + {$s}\n\t\t\tWHERE id = {$id}"); // trigger $this->up->trigger("kriminalitet", array("option" => $krim, "success" => $ret['success'])); // sett ned energien til spilleren $this->up->energy_use(self::ENERGY_KRIM); return $ret; }
/** * Sett oppdrag som vellykket * * @param integer $o_id */ public function success($o_id, $text = 'Oppdraget «$name» ble utført vellykket!') { $o_id = (int) $o_id; if (!isset($this->oppdrag[$o_id])) { return false; } // kontroller at dette oppdraget er aktivt $oppdrag =& $this->oppdrag[$o_id]; $params = $this->params[$o_id]; if ($oppdrag['uo_active'] == 0) { return false; } // oppdater oppdraget $time = time(); $a = \Kofradia\DB::get()->exec("UPDATE users_oppdrag SET uo_repeats = uo_repeats + 1, uo_success = uo_success + 1, uo_last_time = {$time}, uo_last_state = 1, uo_availiable = 0, uo_locked = 1, uo_active = 0, uo_active_time = 0, uo_params = NULL WHERE uo_up_id = {$this->up->id} AND uo_o_id = {$o_id} AND uo_active != 0"); // ble ikke oppdatert? if ($a == 0) { // hent frisk data og avbryt $this->user_load_all(); return false; } $oppdrag['uo_repeats']++; $oppdrag['uo_success']++; $oppdrag['uo_last_time_prev'] = $oppdrag['uo_last_time']; $oppdrag['uo_last_time'] = time(); $oppdrag['uo_available'] = 0; $oppdrag['uo_locked'] = 1; $oppdrag['uo_active'] = 0; $oppdrag['uo_active_time'] = 0; $oppdrag['uo_params'] = null; // fjern oppdraget fra lokalt (skal ikke være på listen) unset($this->active); $this->active = false; unset($this->oppdrag[$o_id]); unset($this->params[$o_id]); $text = str_replace('$name', $oppdrag['o_title'], $text); // send teksten til brukeren if ($this->user_active) { ess::$b->page->add_message($text); } // sjekk for premie $prize = new container($params['o_params']->get("prize")); $prizes_msg = ''; if (count($prize->items) > 0) { $prizes = array(); foreach ($prize->items as $item) { switch ($item[0]) { case "cash": // gi brukeren pengene $cash = (int) $item[1]; $this->up->update_money($cash, true, true); $prizes[] = game::format_cash($cash); break; case "rank_points": $points = (int) $item[1]; $prizes[] = game::format_num($points) . " poeng"; // legg til ranken player::increase_rank_static($points, $this->up->id, true); break; // kuler // kuler case "bullets": $bullets = (int) $item[1]; // har vi plass til noen kuler? $kap = $this->up->weapon ? $this->up->weapon->data['bullets'] : 0; if ($this->up->weapon) { $free = $kap - $this->up->data['up_weapon_bullets'] - $this->up->data['up_weapon_bullets_auksjon']; $bullets = max(0, min($free, $bullets)); if ($bullets > 0) { // gi kuler \Kofradia\DB::get()->exec("UPDATE users_players SET up_weapon_bullets = up_weapon_bullets + {$bullets} WHERE up_id = {$this->up->id}"); $this->up->data['up_weapon_bullets'] += $bullets; $prizes[] = fwords("%d kule", "%d kuler", $bullets); } } break; } } // mottok premie? if (count($prizes) > 0 && $this->user_active) { $last = ''; if (count($prizes) > 1) { $last = " og " . array_pop($prizes); } $prizes_msg = " Du mottok " . implode(", ", $prizes) . $last . "."; ess::$b->page->add_message("Du mottok " . implode(", ", $prizes) . $last . " for å ha fullført oppdraget «{$oppdrag['o_title']}»."); } } // melding i spillelogg global $_game; player::add_log_static("oppdrag", $text . $prizes_msg, 0, $this->up->id); // fjern fra params $this->up->params->lock(); $this->up->params->remove("oppdrag_id"); $this->up->params->remove("oppdrag", true); $this->link_triggers(); // trigger hos spiller $this->up->trigger("oppdrag", array("success" => true, "oppdrag" => $oppdrag, "params" => $params)); return true; }
/** * Overføre penger */ protected function overfor() { $mottaker = postval("mottaker"); $amount = game::intval(postval("amount")); // kontroller at vi har nok penger $result = \Kofradia\DB::get()->query("SELECT {$amount} <= up_bank FROM users_players WHERE up_id = " . $this->up->id); $amount_ok = $result->fetchColumn(0) == 1; // sjekk beløpet if ($amount <= 0) { ess::$b->page->add_message("Ugyldig beløp.", "error"); return; } if ($amount < 50) { ess::$b->page->add_message("Du må sende minimum 50 kr.", "error"); return; } if (!$amount_ok) { ess::$b->page->add_message("Du har ikke så mye penger i banken.", "error"); return; } // har vi ikke tilgang (NoStatUser) if (access::is_nostat() && !access::has("admin")) { ess::$b->page->add_message("Du er NoStatUser og kan ikke sende penger!", "error"); return; } // sjekk session if (postval("sid") != login::$info['ses_id']) { ess::$b->page->add_message("Startet du ikke overføringen selv? :o", "error"); return; } // sjekk mottaker $result = \Kofradia\DB::get()->query("SELECT up_id, up_u_id, up_name, up_access_level, up_bank_ff_id FROM users_players WHERE up_name = " . \Kofradia\DB::quote($mottaker) . " ORDER BY up_access_level = 0, up_last_online DESC LIMIT 1"); $player = $result->fetch(); // ingen gyldig mottaker? if (!$player) { ess::$b->page->add_message("Fant ikke mottakeren.", "error"); return; } // seg selv? if ($player['up_id'] == $this->up->id) { ess::$b->page->add_message("Du kan ikke sende til deg selv.", "error"); return; } // død mottaker? if ($player['up_access_level'] == 0) { ess::$b->page->add_message('<user id="' . $player['up_id'] . '" /> er død. Hvem skal motta pengene?!'); return; } $result = \Kofradia\DB::get()->query("SELECT uc_info FROM users_contacts WHERE uc_u_id = {$player['up_u_id']} AND uc_contact_up_id = " . $this->up->id . " AND uc_type = 2"); $blokkert = $result->rowCount() > 0; $blokkert_info = $blokkert ? $result->fetchColumn(0) : false; // sjekk bankkontoen til mottaker $bank = page_banken_bank::get($player['up_bank_ff_id']); // ingen bankkonto? if (!$bank) { ess::$b->page->add_message("Mottakeren har ingen bankkonto du kan sende til.", "error"); return; } // blokkert? if ($blokkert && !access::has("crewet")) { // blokkert $reason = game::bb_to_html($blokkert_info); $reason = empty($reason) ? '' : ' Begrunnelse: ' . $reason; ess::$b->page->add_message("Denne spilleren har blokkert deg, og du kan derfor ikke sende personen penger.{$reason}", "error"); return; } $note = mb_substr(postval("note"), 0, 100); // hoppe over overføringstapet? $skip_bog = false; if (isset($_POST['skip_bog']) && access::is_nostat()) { $skip_bog = true; $this->bank->overforingstap = 0; $bank->overforingstap = 0; } // regn ut hvor mye penger som skal bli til overs etc $result = \Kofradia\DB::get()->query("SELECT ROUND({$amount} * {$this->bank->overforingstap}), ROUND({$amount} * {$bank->overforingstap}), ROUND({$amount} * {$this->bank->overforingstap}) + ROUND({$amount} * {$bank->overforingstap}), {$amount} - ROUND({$amount} * {$this->bank->overforingstap}) - ROUND({$amount} * {$bank->overforingstap}), {$amount} - ROUND({$amount} * {$this->bank->overforingstap})"); $info = $result->fetch(\PDO::FETCH_NUM); // 0 -> tap sender // 1 -> tap mottaker // 2 -> tap totalt // 3 -> til overs (det som mottakeren får) // 4 -> mellombeløp (utgangsbeløpet - tap sender) // kontrollere at overføringen ikke blir utført flere ganger $form = \Kofradia\Form::getByDomain("banken_" . $player['up_id'], login::$user); // bekreftet? if (isset($_POST['confirm']) && isset($_POST['ovt_s']) && isset($_POST['ovt_m']) && $form->validateHashOrAlert()) { // kontroller overføringstapene (slik at det ikke har skjedd noen endringer) $ovt_s = postval("ovt_s"); $ovt_m = postval("ovt_m"); if ($ovt_s != $this->bank->overforingstap || $ovt_m != $bank->overforingstap) { // det har endret seg login::data_set("banken_ovt_endret", true); } else { // start transaksjon \Kofradia\DB::get()->beginTransaction(); // send pengene $a = \Kofradia\DB::get()->exec("UPDATE users_players AS s, users_players AS m SET s.up_bank = s.up_bank - {$amount}, m.up_bank = m.up_bank + {$info[3]} WHERE s.up_id = " . $this->up->id . " AND m.up_id = {$player['up_id']} AND s.up_bank >= {$amount}"); // mislykket? if ($a == 0) { ess::$b->page->add_message("Noe gikk galt under overføringen.", "error"); \Kofradia\DB::get()->commit(); } else { // lagre overføringslogg \Kofradia\DB::get()->exec("INSERT INTO bank_log SET bl_sender_up_id = " . $this->up->id . ", bl_receiver_up_id = {$player['up_id']}, amount = {$info[4]}, time = " . time()); // oppdater senderen \Kofradia\DB::get()->exec("UPDATE users_players SET up_bank_sent = up_bank_sent + {$info[4]}, up_bank_profit = up_bank_profit - {$info[4]}, up_bank_num_sent = up_bank_num_sent + 1, up_bank_charge = up_bank_charge + {$info[0]} WHERE up_id = " . $this->up->id); // oppdater mottakeren \Kofradia\DB::get()->exec("UPDATE users_players SET up_bank_received = up_bank_received + {$info[4]}, up_bank_profit = up_bank_profit + {$info[4]}, up_bank_num_received = up_bank_num_received + 1, up_bank_charge = up_bank_charge + {$info[1]} WHERE up_id = {$player['up_id']}"); // spillelogg (med melding) $player2 = new player($player['up_id']); $player2->add_log("bankoverforing", $info[4] . ":" . $note, $this->up->id); // legg til transaksjonsrader if ($info[0] > 0) { \Kofradia\DB::get()->exec("INSERT INTO ff_bank_transactions SET ffbt_ff_id = {$this->bank->id}, ffbt_time = " . time() . ", ffbt_amount = {$amount}, ffbt_profit = {$info[0]}"); } if ($info[1] > 0) { \Kofradia\DB::get()->exec("INSERT INTO ff_bank_transactions SET ffbt_ff_id = {$bank->id}, ffbt_time = " . time() . ", ffbt_amount = {$amount}, ffbt_profit = {$info[1]}"); } // IRC logg putlog("LOG", "%c9%uBANKOVERFØRING:%u%c (%u" . $this->up->data['up_name'] . "%u) sendte (%u" . game::format_cash($amount) . "%u (%u{$info[3]}%u)) til (%u{$player['up_name']}%u) (TAP: " . game::format_cash($info[2]) . ") " . (!empty($note) ? 'Melding: (' . $note . ')' : 'Ingen melding.')); ess::$b->page->add_message('Du overførte <b>' . game::format_cash($info[4]) . '</b> til <user id="' . $player['up_id'] . '" />.' . ($info[0] > 0 ? ' Banken din tok <b>' . game::format_cash($info[0]) . '</b> i overføringsgebyr.' : '')); \Kofradia\DB::get()->commit(); // trigger $this->up->update_money(-$amount, false, false, null); $player2->update_money($info[3], false, false, null); redirect::handle(); } } } ess::$b->page->add_css('.dl_bank dd { text-align: right }'); // vis godkjenn form echo ' <h1>Banken - overføring</h1> <form action="" method="post"> <input type="hidden" name="mottaker" value="' . htmlspecialchars($mottaker) . '" /> <input type="hidden" name="amount" value="' . $amount . '" /> <input type="hidden" name="note" value="' . htmlspecialchars($note) . '" /> <input type="hidden" name="ovt_s" value="' . $this->bank->overforingstap . '" /> <input type="hidden" name="ovt_m" value="' . $bank->overforingstap . '" /> ' . $form->getHTMLInput(); // hoppe over overføringstapet? if ($skip_bog) { echo ' <input type="hidden" name="skip_bog" />'; } echo ' <input type="hidden" name="sid" value="' . login::$info['ses_id'] . '" /> <div style="width: 200px; padding-left: 100px; float: left"> <div class="section"> <h2>Avsender</h2> <dl class="dl_30"> <dt>Kontoeier</dt> <dd>' . game::profile_link() . '</dd> <dt>Bankfirma</dt> <dd><a href="ff/?ff_id=' . $this->bank->id . '">' . htmlspecialchars($this->bank->data['ff_name']) . '</a></dd> <dt><abbr title="Overføringstap">Overf.tap</abbr></dt> <dd>' . $this->bank->overforingstap * 100 . ' %</dd> <dt>Plassering</dt> <dd>' . (!isset(game::$bydeler[$this->bank->data['br_b_id']]) ? '<span style="color: #777777">Ukjent</span>' : htmlspecialchars(game::$bydeler[$this->bank->data['br_b_id']]['name'])) . '</dd> </dl> </div> </div> <div style="width: 200px; padding-left: 20px; float: left"> <div class="section"> <h2>Mottaker</h2> <dl class="dl_30"> <dt>Kontoeier</dt> <dd><user id="' . $player['up_id'] . '" /></dd> <dt>Bankfirma</dt> <dd><a href="ff/?ff_id=' . $bank->id . '">' . htmlspecialchars($bank->data['ff_name']) . '</a></dd> <dt><abbr title="Overføringstap">Overf.tap</abbr></dt> <dd>' . $bank->overforingstap * 100 . ' %</dd> <dt>Plassering</dt> <dd>' . (!isset(game::$bydeler[$bank->data['br_b_id']]) ? '<span style="color: #777777">Ukjent</span>' : htmlspecialchars(game::$bydeler[$bank->data['br_b_id']]['name'])) . '</dd> </dl> </div> </div> <div class="clear" style="width: 420px; margin-left: 100px"> <div class="section"> <h2>Overføringsinformasjon</h2> <dl class="dl_40 dl_bank"> <dt>Overføringsbeløp</dt> <dd>' . game::format_cash($amount) . '</dd>'; // hopper over overføringstapet? if ($skip_bog) { echo ' <dt>Hopper over overføringstapet</dt> <dd>NoStat</dd>'; } echo ' <dt>Overføringstap for avsender</dt> <dd>' . game::format_cash($info[0]) . '</dd> <dt>Overføringstap for mottaker</dt> <dd>' . game::format_cash($info[1]) . '</dd> <dt>Mottaker får</dt> <dd>' . game::format_cash($info[3]) . '</dd> <dt>Melding</dt> <dd>' . (empty($note) ? 'Ingen melding.' : game::bb_to_html($note)) . '</dd> </dl> <h4> ' . show_sbutton("Utfør overføring", 'name="confirm"') . ' ' . show_sbutton("Avbryt/endre", 'name="abort"') . ' </h4> </div> </div> </form>'; ess::$b->page->load(); }
/** * Bryte ut fra fengsel */ protected function bryt_ut() { // allerede i fengsel? if ($this->up->fengsel_check()) { ess::$b->page->add_message("Du er allerede i fengsel.", "error"); redirect::handle(); } // har vi ikke nok energi? if (!$this->up->energy_check(self::ENERGY)) { ess::$b->page->add_message("Du har ikke nok energi for å bryte ut andre spillere nå."); redirect::handle(); } $time = intval(postval('time')); // hent informasjon @(list($up_id, $expire, $dusor) = explode("_", $_POST['up_id'] . "_", 3)); $up_id = intval($up_id); $expire = intval($expire); $dusor = game::intval($dusor); $up = player::get($up_id); if (!$up) { ess::$b->page->add_message("Fant ikke brukeren.", "error"); redirect::handle(); } // ikke i fengsel lengre? $wait = $up->fengsel_wait(); if ($wait == 0) { ess::$b->page->add_message('<user id="' . $up->id . '" /> er nok allerede brutt ut!', "error"); redirect::handle(); } // ikke riktig tid? if ($up->data['up_fengsel_time'] != $expire) { ess::$b->page->add_message('<user id="' . $up->id . '" /> har kommet i fengsel på nytt. Prøv igjen.', "error"); redirect::handle(); } // feil dusør? if ($up->data['up_fengsel_dusor'] != $dusor) { ess::$b->page->add_message('Dusøren til <user id="' . $up->id . '" /> har endret seg. Prøv på nytt.', "error"); redirect::handle(); } // sett opp sannsynlighet $prob = self::calc_prob($wait, $up->data['up_wanted_level'] / 10); $points = self::calc_points($prob); // sett opp dusør $dusor_org = $up->data['up_fengsel_dusor']; $dusor = bcmul($up->data['up_fengsel_dusor'], self::DUSOR_PROFIT); // klarte vi det? $success = rand(0, 999) < $prob * 10; if ($success) { // penger man får for utbrytelsen $cash = round(max(0, 100 - $prob) / 100 * self::CASH_MAX); // sett som utbrytet $a = \Kofradia\DB::get()->exec("\n\t\t\t\tUPDATE users_players\n\t\t\t\tSET up_fengsel_time = " . (time() - 1) . ", up_fengsel_dusor_total_out = up_fengsel_dusor_total_out + up_fengsel_dusor, up_fengsel_dusor = 0\n\t\t\t\tWHERE up_id = {$up->id} AND up_fengsel_time = {$up->data['up_fengsel_time']} AND up_fengsel_dusor = {$up->data['up_fengsel_dusor']}"); if ($a == 0) { ess::$b->page->add_message('<user id="' . $up->id . '" /> er nok allerede brutt ut!', "error"); redirect::handle(); } $up->data['up_fengsel_time'] = time() - 1; $up->data['up_fengsel_dusor_total_out'] = bcadd($up->data['up_fengsel_dusor_total_out'], $up->data['up_fengsel_dusor']); $up->data['up_fengsel_dusor'] = 0; // oppdater antall utbrytninger og gi evt. penger \Kofradia\DB::get()->exec("\n\t\t\t\tUPDATE users_players\n\t\t\t\tSET up_fengsel_num_out_tries = up_fengsel_num_out_tries + 1, up_fengsel_num_out_success = up_fengsel_num_out_success + 1, up_cash = up_cash + {$cash} + {$dusor}, up_fengsel_dusor_total_in = up_fengsel_dusor_total_in + {$dusor}\n\t\t\t\tWHERE up_id = " . $this->up->id); $this->up->update_money(bcadd($cash, $dusor), true, false); // hendelse for spilleren som ble brutt ut $up->add_log("fengsel", $dusor_org > 0 ? $dusor_org : null, $this->up->id); $fengsel = $this->up->fengsel_rank($points, true); // penger, dusør og poeng vi mottar $mottok = array(); if ($cash > 0) { $mottok[] = game::format_cash($cash); } if ($dusor > 0) { $mottok[] = "dusøren på " . game::format_cash($dusor); } $mottok[] = game::format_num($points) . ' poeng'; // melding $msg = 'Du brøt ut <user id="' . $up->id . '" /> fra fengselet og mottok ' . sentences_list($mottok) . '.'; if ($fengsel > 0) { $msg .= ' Wanted nivået økte med ' . game::format_number($fengsel / 10, 1) . ' %.'; } ess::$b->page->add_message($msg); // logg putlog("LOG", "FENGSELUTBRYTNING: {$this->up->data['up_name']} brøt ut {$up->data['up_name']} fra fengsel (wait={$wait}, cash={$cash}, dusør={$dusor_org}, prob={$prob}, rank={$points})"); // rank $this->up->increase_rank($points); } else { // mislykket $fengsel = $this->up->fengsel_rank($points, false, true); // oppdater antall utbrytninger (kun forsøk) \Kofradia\DB::get()->exec("UPDATE users_players SET up_fengsel_num_out_tries = up_fengsel_num_out_tries + 1 WHERE up_id = " . $this->up->id); if ($fengsel > 0) { ess::$b->page->add_message('Mislykket! Wanted nivået økte med ' . game::format_number($fengsel / 10, 1) . ' %.'); } } // trigger $this->up->trigger("fengsel", array("success" => $success, "up" => $up, "wait" => $wait, "prob" => $prob, "points" => $points, "cash" => $success ? $cash : null, "dusor" => $dusor, "dusor_org" => $dusor_org)); $up->trigger("fengsel_affected", array("success" => $success, "up" => $this->up, "wait" => $wait, "prob" => $prob, "points" => $points, "cash" => $success ? $cash : null, "dusor" => $dusor, "dusor_org" => $dusor_org)); // energy $this->up->energy_use(self::ENERGY); redirect::handle(); }
/** * Formatter tekst for premie (og gi ut hvis spesifisert) */ protected function prize($give = false) { // mulige premier: // * cash // * points // * bullets $params = new params($this->a->data['ac_prize']); $text = array(); // cash if ($cash = $params->get("cash")) { if ($give) { $this->up->update_money($cash); } $text[] = game::format_cash($cash); } // points if ($points = $params->get("points")) { if ($give) { $this->up->increase_rank($points); } $text[] = game::format_num($points) . " rankpoeng"; } // kuler if ($bullets = $params->get("bullets")) { $bullets = (int) $bullets; // har vi plass til noen kuler? if ($this->up->weapon) { $kap = $this->up->weapon ? $this->up->weapon->data['bullets'] : 0; $free = $kap - $this->up->data['up_weapon_bullets'] - $this->up->data['up_weapon_bullets_auksjon']; $bullets = max(0, min($free, $bullets)); if ($bullets > 0) { if ($give) { // gi kuler \Kofradia\DB::get()->exec("UPDATE users_players SET up_weapon_bullets = up_weapon_bullets + {$bullets} WHERE up_id = {$this->up->id}"); $this->up->data['up_weapon_bullets'] += $bullets; } $text[] = fwords("%d kule", "%d kuler", $bullets); } } } return sentences_list($text); }