public function onThrow(SR_Player $player, SR_Player $target) { $firearms = $player->get('firearms'); $atk = 20 + $firearms; $mindmg = 1; $maxdmg = 6; $out_dmg = ''; $out_dmgep = ''; $out_eff = ''; $inaccuracy = rand(2, 4) - ($firearms ? 1 : 0); $targets = $this->computeDistances($target, $inaccuracy); foreach ($targets as $data) { list($t, $d) = $data; $t instanceof SR_Player; $a = $atk - $d + rand(-1, 2); $a = Common::clamp($a, 0, $atk); $def = $t->get('defense'); $arm = $t->get('marm'); $hits = Shadowfunc::diceHits($mindmg, $arm, $atk, $def, $player, $t); $hits -= $arm; $hits = Common::clamp($hits, 0); if ($hits == 0) { continue; } $dmg = round($mindmg + $hits / 10, 2); if ($dmg <= 0) { continue; } } }
public function onThrow(SR_Player $player, SR_Player $target) { $party = $player->getParty(); $ep = $party->getEnemyParty(); $mc = $party->getMemberCount(); $firearms = $player->get('firearms'); $atk = 15; $mindmg = 1; $maxdmg = 4; $damage = array(); $inaccuracy = rand(2, 4) - ($firearms ? 1 : 0); $targets = self::computeDistances($target, $inaccuracy); foreach ($targets as $data) { list($pid, $d) = $data; $target = $ep->getMemberByPID($pid); $target instanceof SR_Player; $a = $atk - $d * $d + rand(-1, 2); $a = Common::clamp($a, 0, $atk); $def = $target->get('defense'); $arm = $target->get('marm'); $hits = Shadowfunc::diceHits($mindmg, $arm, $a, $def, $player, $target); $hits = Common::clamp($hits, 0); echo "Dicing... DIST: {$d}, ATK: {$a}, DEF: {$def}. Hits: {$hits}\n"; // $hits -= $arm; if ($hits <= 0) { continue; } $dmg = round($mindmg + $hits * 0.1, 2); $dmg = Common::clamp($dmg, $mindmg, $maxdmg); $dmg -= $arm; if ($dmg <= 0) { continue; } echo "Blinding the target with {$hits} hits ...\n"; for ($i = 0; $i < $hits; $i += 3) { $target->addEffects(new SR_Effect($i * 10, array('attack' => -0.15), SR_Effect::MODE_ONCE)); } $damage[$pid] = $dmg; } Shadowfunc::multiDamage($player, $damage, 'The Flashbang totally missed all targets.'); }
public function onAttackB(SR_Player $player, $arg, $armor_type) { $p = $player->getParty(); $mc = $p->getMemberCount(); $ep = $p->getEnemyParty(); if (false === ($target = $this->getOffensiveTarget($player, $arg))) { return false; } $d = abs($player->getY() - $target->getY()); $d2 = Common::clamp($d - 2, 0); if ($d > $this->getItemRange()) { $player->getParty()->moveTowards($player, $target); return true; } if ($this instanceof SR_FireWeapon) { $this->increase('sr4it_ammo', -$this->getBulletsPerShot()); } # Bows are great for distance if ($this instanceof SR_Bow) { $d2 /= 4; } elseif ($this instanceof SR_MeleeWeapon) { $d2 = 0; } $busy = $player->busy($this->getRealAttackTime()); $mindmg = $player->get('min_dmg'); $maxdmg = $player->get('max_dmg'); $arm = $target->get($armor_type); $atk = round(Common::clamp($player->get('attack') - $d2 * 1.2, 1)); $def = $target->get('defense'); $hits = Shadowfunc::diceHits($mindmg, $arm, $atk, $def, $player, $target); $pname = $player->displayNameNB(); $tname = $target->displayNameNB(); $iname = $this->getName(); # Debug // Dog_Log::debug(sprintf('%s (ATK: %s HP: %s) vs. %s (DEF: %s HP: %s) = HITS: %s',$player->getName(),$atk,$player->getHP(),$target->getName(),$def,$target->getHP(),$hits)); # Miss if ($hits < 1) { $p->ntice('5230', array($pname, $tname, $iname, $busy)); $ep->ntice('5230', array($pname, $tname, $iname, $busy)); return true; // $msg .= ' but misses.'; } # Hit $damage = $hits * 0.1; $damage = round(Common::clamp($damage, 0.0, $maxdmg), 1); # Crit? $sharp = $player->getCritPermille(); if (rand(0, 1000) < $sharp) { $damage += Shadowfunc::diceFloat(1.0, $hits * 0.1 + 1.0, 1); $crit = 1; $bold = ""; } else { $crit = false; $bold = ''; } # No damage if ($damage <= 0) { $p->ntice('5231', array($pname, $tname, $iname, $busy)); $ep->ntice('5231', array($pname, $tname, $iname, $busy)); return true; // $msg .= sprintf(' but causes no damage.'); // $hpmsg = sprintf(' %s/%s HP left.', round($target->getHP(), 1), round($target->get('max_hp'), 1)); } $target->dealDamage($damage); # Special poison weapons $this->onDealDamage($player, $target, $hits, $damage); # Some damage if (false === $target->isDead()) { $p->ntice('5232', array($pname, $tname, $iname, $damage, $busy, $bold, $crit)); $ep->ntice('5233', array($pname, $tname, $iname, $damage, $target->getHP(), $target->getMaxHP(), $busy, $bold, $crit)); return true; } ########### # Killed! # ########### $xp = $target->isHuman() ? 0 : $target->getLootXP(); $nuyen = $target->getLootNuyen(); if ($player->isNPC()) { $target->resetXP(); } $target->giveNuyen(-$nuyen); $tl = $target->getBase('level'); $ploot = array(); $pxp = 0; foreach ($p->getMembers() as $member) { $member instanceof SR_Player; $lxp = $xp / $mc; $leveldiff = ($tl + 1) / ($member->getBase('level') + 1); $lxp *= $leveldiff; $lxp = round(Common::clamp($lxp, 0.01), 2); $pxp += $lxp; $xps[] = $lxp; $lny = round($nuyen / $mc, 2); $member->giveNuyen($lny); $member->msg('5234', array($pname, $tname, $iname, $damage, $busy, Shadowfunc::displayNuyen($lny), $lxp, $bold, $crit)); $member->giveXP($lxp); // $member->setOption(SR_Player::STATS_DIRTY, true); } $p->givePartyXP($pxp); $ep->ntice('5235', array($pname, $tname, $iname, $damage, $busy, $bold, $crit)); $target->gotKilledBy($player); return true; }