Author Topic: Damage systems  (Read 777 times)

Offline Emicarn

  • Level 5
  • *
  • Posts: 19
  • Reputation: +0/-0
    • View Profile
Damage systems
« on: December 30, 2010, 08:53:00 AM »
Morning All.

Just looking for some input on the best way to work up a damage system.  The game is a space combat game with 13 ship board systems including crew and marines.

What I've worked up so far basically works this way:

Computer damage by weapon as random

->  If damage < defenses then subtract damage from defenses

-> if damage > defenses set defenses to zero and move on.

-> determine if hull is < 50% damaged

    -> if no reduce hull by amount of remaining damage
    -> if yes determine random system to damage
 
             -> compute new system remaining points based on damage.


Here's where it gets ugly... I end up with a bunch of nested IF statements to determine a random system, compute damage done, adjust variables, and then move on to next weapon system.

Just looking for any input on a better way to go about this.

Thanks

Thanks!

~ Rich

http://www.sectorbattles.com [not ready for prime time]

Offline Chris

  • Game Owner
  • Level 35
  • *
  • Posts: 2,217
  • Reputation: +28/-1
    • View Profile
Re: Damage systems
« Reply #1 on: December 30, 2010, 10:47:59 AM »
Damage goes to shields, remaining goes to hull if above 50% hull, stop.
Damage goes to shields, remaining goes to ONE random system if hull below or equal 50% hull, if no alive system present damage goes to hull, stop.
If at any time hull is reduced to 0% or life support syetem is 0% the ship goes kaboom!


BTW, it is not very playable, systems can sink too much damage. Would be better if most damage goes to hull unless like 20% chance when it goes to a random system. Or 50% always goes to hull and 50% to a random system if hull is severly damaged.

Offline Nox

  • Level 35
  • **
  • Posts: 767
  • Reputation: +12/-2
    • View Profile
Re: Damage systems
« Reply #2 on: December 30, 2010, 10:52:22 AM »
It would be easier to advise on a concrete code, but...

You can (and should) distribute it to more functions or hierarchy, similarly to UNIX's philosofy that a function should do only one very specific thing
First two points in one function, next three in another, those two called in some other function computes one weapon system and another function to rule them all...to compute the whole damage - iterate over all systems falling the previous function

This of course is not the Only True Way... it can be different or just more or less hierarchized
Meet us at an IRC irc.freenode.net #bbg as well
https://vimeo.com/36579366 (a must-watch) | Join BOINC - no longer a hype, but you can help never the less

Offline Emicarn

  • Level 5
  • *
  • Posts: 19
  • Reputation: +0/-0
    • View Profile
Re: Damage systems
« Reply #3 on: December 30, 2010, 11:01:17 AM »
It would be easier to advise on a concrete code, but...

 

Here is a cut of the code to show what I'm working on.  This is not fully functional and tested....

Code: [Select]
$beamattack = 1;
$torpedoattack = 1;

while ($beamattack <= $beamweapons)
{
$beam_damage = (rand()%5);
echo $beam_damage . '<br><br>';

 
if ($defender[c_shield] >= $beam_damage)
{
$defender[c_shield] = $defender[c_shield] - $beam_damage;
$beam_damage = 0;
}

if ($defender[c_shield] < $beam_damage)
{
$beam_damage = $beam_damage - $defender[c_shield];
$defender[c_shield] = $defender[c_shield] = 0;
}

if ($beam_damage > 0)
{
if (($defender[c_hull]/$defender[m_hull]) >= 0.50)
{
if ($defender[c_hull] >= $beam_damage)
{
$defender[c_hull] - $beam_damage;
$beam_damage = 0;
}

}

if (($defender[c_hull]/$defender[m_hull]) < 0.50)
{

while ($beam_damage > 0)
{

$system_damaged = (rand()%11);


if ($system_damaged == 0)
{
$system_name = hull;
}

if ($system_damaged == 1)
{
$system_name = engine;
}

if ($system_damaged == 2)
{
$system_name = battery;
}

if ($system_damaged == 3)
{
$system_name = aux_power;
}

if ($system_damaged == 4)
{
$system_name = sensors;
}

if ($system_damaged == 5)
{
$system_name = dc;
}

if ($system_damaged == 6)
{
$system_name = transporters;
}

if ($system_damaged == 7)
{
$system_name = beam_weapon;
}

if ($system_damaged == 8)
{
$system_name = torpedo_weapon;
}

if ($system_damaged == 9)
{
$system_name = crew;
}

if ($system_damaged == 10)
{
$system_name = marines;
}
   
$system_damaged = $system_damaged + 17;
echo $system_damaged;
$do_system_damage = $defender[$system_damaged];
echo $do_system_damage;
exit;

if ($do_system_damage >= $beam_damage)
{
$do_system_damage = $do_system_damage - $beam_damage;
$beam_damage = 0;
}

if ($do_system_damage < $beam_damage)
{
$beam_damage = $beam_damage - $do_system_damage;
$do_system_damage = 0;
}

}
}

Hopefully the indents worked!

Thanks!

~ Rich

http://www.sectorbattles.com [not ready for prime time]

Offline Nox

  • Level 35
  • **
  • Posts: 767
  • Reputation: +12/-2
    • View Profile
Re: Damage systems
« Reply #4 on: December 30, 2010, 12:00:53 PM »
Code: [Select]
<?php
$system_names 
= array(
'hull''engine''battery''aux_power''sensors''dc''transporters''beam_weapon''torpedo_weapon''crew''marines'
);

$defender = array( /* ... */ );
$weapons = array(
'beam' => 10,
'torpedoes' => 12,
'majorLeafletCampaignFollowedUpByASeriesOfCharityDrives' => 100
);

function 
attack$defender$weapons$system_names )
{
foreach($weapons as $weaponType => $count)
{
echo "Starting attack with $weaponType<br>";

for($i=0;$i<$count;$i++)
{
echo "$weaponType attack #$i<br>";
weaponAttack($defender$system_names);
}
}

return $defender;
}

function 
shieldAdjustment( &$defender$damage)
{
if ($defender['c_shield'] >= $damage)
{
$defender['c_shield'] = $defender['c_shield'] - $damage;
return 0;
}

$damage $damage $defender['c_shield'];
$defender['c_shield'] = 0;

return $damage;
}

function 
hullAdjustment( &$defender$damage$system_names )
{
if (($defender['c_hull']/$defender['m_hull']) >= 0.50)
{
if ($defender['c_hull'] >= $damage)
{
$defender['c_hull'] - $damage;
return;
}

}
else
while ($damage 0)
{
$do_system_damage $defender$system_namesrand()%11 ] + 17 ];

if ($do_system_damage >= $damage)
{
$do_system_damage $do_system_damage $damage;
$damage 0;
}
else
{
$damage $damage $do_system_damage;
$do_system_damage 0;
}
}
}

function 
weaponAttack( &$defender$system_names )
{
$damage = (rand()%5);

$damage shieldAdjustment($defender$damage);

if ($damage 0)
hullAdjustment($defender$damage$system_names);
}
?>

This is probably not functional either, but showing some measure of generalization to split the large ball into little simple parts
Meet us at an IRC irc.freenode.net #bbg as well
https://vimeo.com/36579366 (a must-watch) | Join BOINC - no longer a hype, but you can help never the less

Offline Emicarn

  • Level 5
  • *
  • Posts: 19
  • Reputation: +0/-0
    • View Profile
Re: Damage systems
« Reply #5 on: December 30, 2010, 08:31:07 PM »

This is probably not functional either, but showing some measure of generalization to split the large ball into little simple parts

Awesome!  This is much cleaner then the disaster I came up with and something I didn't consider. 


Thank you.   

Thanks!

~ Rich

http://www.sectorbattles.com [not ready for prime time]

 


SimplePortal 2.3.3 © 2008-2010, SimplePortal