Files
Aurora.3/code/unit_tests/mob_tests.dm
OneOneThreeEight 6f78d13e78 adjusts burn modifiers of the baseline IPC and industrial IPC machine species... and prosthetics, by extension (#3834)
Changes: Industrial IPC burn modifier changed to 1.1. Baseline IPC burn modifier changed to 1.2. Industrial IPCs should tank more damage, baselines should tank less due to their more agile frame, though brute is still only moderately effective against baselines. They aren't brittle but aren't tanky like industrials. This also makes baselines take a fair bit more damage from remaining in a vacuum, which they took very little before. Industrials were applied this in a bit of an unfair way, however, given they are walking heat sinks and should be treated as such. Both will still get roasted by lasers, the baseline moreso than the industrial.
2017-11-29 10:33:29 +02:00

554 lines
14 KiB
Plaintext

/*
*
* Mob Unit Tests.
*
* Human suffocation in Space.
* Mob damage Template
*
*/
#define SUCCESS 1
#define FAILURE 0
//
// Tests Life() and mob breathing in space.
//
datum/unit_test/human_breath
name = "MOB: Human Suffocates in Space"
var/starting_oxyloss = null
var/ending_oxyloss = null
var/mob/living/carbon/human/H
async = 1
datum/unit_test/human_breath/start_test()
var/turf/T = locate(20,20,1) //TODO: Find better way.
if(!istype(T, /turf/space)) //If the above isn't a space turf then we force it to find one will most likely pick 1,1,1
T = locate(/turf/space)
H = new(T)
starting_oxyloss = damage_check(H, OXY)
return 1
datum/unit_test/human_breath/check_result()
if(H.life_tick < 10) // Finish Condition
return 0 // Return 0 to try again later.
ending_oxyloss = damage_check(H, OXY)
if(starting_oxyloss < ending_oxyloss)
pass("Oxyloss = [ending_oxyloss]")
else
fail("Mob is not taking oxygen damage. Damange is [ending_oxyloss]")
return 1 // return 1 to show we're done and don't want to recheck the result.
// ============================================================================
//#define BRUTE "brute"
//#define BURN "fire"
//#define TOX "tox"
//#define OXY "oxy"
//#define CLONE "clone"
//#define HALLOSS "halloss"
proc/create_test_mob_with_mind(var/turf/mobloc = null, var/mobtype = /mob/living/carbon/human)
var/list/test_result = list("result" = FAILURE, "msg" = "", "mobref" = null)
if(isnull(mobloc))
mobloc = pick(tdome1)
if(!mobloc)
test_result["msg"] = "Unable to find a location to create test mob"
return test_result
var/mob/living/carbon/human/H = new mobtype(mobloc)
H.mind_initialize("TestKey[rand(0,10000)]")
test_result["result"] = SUCCESS
test_result["msg"] = "Mob created"
test_result["mobref"] = "\ref[H]"
return test_result
//Generic Check
// TODO: Need to make sure I didn't just recreate the wheel here.
proc/damage_check(var/mob/living/M, var/damage_type)
var/loss = null
switch(damage_type)
if(BRUTE)
loss = M.getBruteLoss()
if(BURN)
loss = M.getFireLoss()
if(TOX)
loss = M.getToxLoss()
if(OXY)
loss = M.getOxyLoss()
if(CLONE)
loss = M.getCloneLoss()
if(HALLOSS)
loss = M.getHalLoss()
if(!loss && istype(M, /mob/living/carbon/human)) // Revert IPC's when?
var/mob/living/carbon/human/H = M // IPC's have robot limbs which don't report damage to getXXXLoss()
if(istype(H.species, /datum/species/machine)) // So we have ot hard code this check or create a different one for them.
return 100 - H.health // TODO: Find better way to do this then hardcoding this formula
return loss
// ==============================================================================================================
//
//DAMAGE EXPECTATIONS
// used with expectected_vunerability
#define STANDARD 0 // Will take standard damage (damage_ratio of 1)
#define ARMORED 1 // Will take less damage than applied
#define EXTRA_VULNERABLE 2 // Will take more dmage than applied
#define IMMUNE 3 // Will take no damage
//==============================================================================================================
datum/unit_test/mob_damage
name = "MOB: Template for mob damage"
var/mob/living/carbon/human/testmob = null
var/damagetype = BRUTE
var/mob_type = /mob/living/carbon/human
var/expected_vulnerability = STANDARD
var/check_health = 0
var/damage_location = "chest"
datum/unit_test/mob_damage/start_test()
var/list/test = create_test_mob_with_mind(null, mob_type)
var/damage_amount = 5 // Do not raise, if damage >= 10 there is a % chance to reduce damage by half in /obj/item/organ/external/take_damage()
// Which makes checks impossible.
if(isnull(test))
fail("Check Runtimed in Mob creation")
return 0
if(test["result"] == FAILURE)
fail(test["msg"])
return 0
var/mob/living/carbon/human/H = locate(test["mobref"])
if(isnull(H))
fail("Test unable to set test mob from reference")
return 0
if(H.stat)
fail("Test needs to be re-written, mob has a stat = [H.stat]")
return 0
if(H.sleeping)
fail("Test needs to be re-written, mob is sleeping for some unknown reason")
return 0
// Damage the mob
var/initial_health = H.health
H.apply_damage(damage_amount, damagetype, damage_location)
H.updatehealth() // Just in case, though at this time apply_damage does this for us.
// We operate with the assumption that someone might mess with that proc one day.
var/ending_damage = damage_check(H, damagetype)
var/ending_health = H.health
// Now test this stuff.
var/failure = 0
var/damage_ratio = STANDARD
if (ending_damage == 0)
damage_ratio = IMMUNE
else if (ending_damage < damage_amount)
damage_ratio = ARMORED
else if (ending_damage > damage_amount)
damage_ratio = EXTRA_VULNERABLE
if(damage_ratio != expected_vulnerability)
failure = 1
// Now generate the message for this test.
var/expected_msg = null
switch(expected_vulnerability)
if(STANDARD)
expected_msg = "to take standard damage"
if(ARMORED)
expected_msg = "To take less damage"
if(EXTRA_VULNERABLE)
expected_msg = "To take extra damage"
if(IMMUNE)
expected_msg = "To take no damage"
var/msg = "Damage taken: [ending_damage] out of [damage_amount] || expected: [expected_msg] \[Overall Health:[ending_health] (Initial: [initial_health]\]"
if(failure)
fail(msg)
else
pass(msg)
return 1
// =================================================================
// Human damage check.
// =================================================================
datum/unit_test/mob_damage/brute
name = "MOB: Human Brute damage check"
damagetype = BRUTE
datum/unit_test/mob_damage/fire
name = "MOB: Human Fire damage check"
damagetype = BURN
datum/unit_test/mob_damage/tox
name = "MOB: Human Toxin damage check"
damagetype = TOX
datum/unit_test/mob_damage/oxy
name = "MOB: Human Oxygen damage check"
damagetype = OXY
datum/unit_test/mob_damage/clone
name = "MOB: Human Clone damage check"
damagetype = CLONE
datum/unit_test/mob_damage/halloss
name = "MOB: Human Halloss damage check"
damagetype = HALLOSS
// =================================================================
// Unathi
// =================================================================
datum/unit_test/mob_damage/unathi
name = "MOB: Unathi damage check template"
mob_type = /mob/living/carbon/human/unathi
datum/unit_test/mob_damage/unathi/brute
name = "MOB: Unathi Brute Damage Check"
damagetype = BRUTE
expected_vulnerability = ARMORED
datum/unit_test/mob_damage/unathi/fire
name = "MOB: Unathi Fire Damage Check"
damagetype = BURN
datum/unit_test/mob_damage/unathi/tox
name = "MOB: Unathi Toxins Damage Check"
damagetype = TOX
datum/unit_test/mob_damage/unathi/oxy
name = "MOB: Unathi Oxygen Damage Check"
damagetype = OXY
datum/unit_test/mob_damage/unathi/clone
name = "MOB: Unathi Clone Damage Check"
damagetype = CLONE
datum/unit_test/mob_damage/unathi/halloss
name = "MOB: Unathi Halloss Damage Check"
damagetype = HALLOSS
// =================================================================
// SpessKahjit aka Tajaran
// =================================================================
datum/unit_test/mob_damage/tajaran
name = "MOB: Tajaran damage check template"
mob_type = /mob/living/carbon/human/tajaran
datum/unit_test/mob_damage/tajaran/brute
name = "MOB: Tajaran Brute Damage Check"
damagetype = BRUTE
expected_vulnerability = EXTRA_VULNERABLE
datum/unit_test/mob_damage/tajaran/fire
name = "MOB: Tajaran Fire Damage Check"
damagetype = BURN
datum/unit_test/mob_damage/tajaran/tox
name = "MOB: Tajaran Toxins Damage Check"
damagetype = TOX
datum/unit_test/mob_damage/tajaran/oxy
name = "MOB: Tajaran Oxygen Damage Check"
damagetype = OXY
datum/unit_test/mob_damage/tajaran/clone
name = "MOB: Tajaran Clone Damage Check"
damagetype = CLONE
datum/unit_test/mob_damage/tajaran/halloss
name = "MOB: Tajaran Halloss Damage Check"
damagetype = HALLOSS
// =================================================================
// Resomi
// =================================================================
datum/unit_test/mob_damage/resomi
name = "MOB: Resomi damage check template"
mob_type = /mob/living/carbon/human/resomi
datum/unit_test/mob_damage/resomi/brute
name = "MOB: Resomi Brute Damage Check"
damagetype = BRUTE
expected_vulnerability = EXTRA_VULNERABLE
datum/unit_test/mob_damage/resomi/fire
name = "MOB: Resomi Fire Damage Check"
damagetype = BURN
expected_vulnerability = EXTRA_VULNERABLE
datum/unit_test/mob_damage/resomi/tox
name = "MOB: Resomi Toxins Damage Check"
damagetype = TOX
datum/unit_test/mob_damage/resomi/oxy
name = "MOB: Resomi Oxygen Damage Check"
damagetype = OXY
datum/unit_test/mob_damage/resomi/clone
name = "MOB: Resomi Clone Damage Check"
damagetype = CLONE
datum/unit_test/mob_damage/resomi/halloss
name = "MOB: Resomi Halloss Damage Check"
damagetype = HALLOSS
// =================================================================
// Skrell
// =================================================================
datum/unit_test/mob_damage/skrell
name = "MOB: Skrell damage check template"
mob_type = /mob/living/carbon/human/skrell
datum/unit_test/mob_damage/skrell/brute
name = "MOB: Skrell Brute Damage Check"
damagetype = BRUTE
datum/unit_test/mob_damage/skrell/fire
name = "MOB: Skrell Fire Damage Check"
damagetype = BURN
datum/unit_test/mob_damage/skrell/tox
name = "MOB: Skrell Toxins Damage Check"
damagetype = TOX
datum/unit_test/mob_damage/skrell/oxy
name = "MOB: Skrell Oxygen Damage Check"
damagetype = OXY
datum/unit_test/mob_damage/skrell/clone
name = "MOB: Skrell Clone Damage Check"
damagetype = CLONE
datum/unit_test/mob_damage/skrell/halloss
name = "MOB: Skrell Halloss Damage Check"
damagetype = HALLOSS
// =================================================================
// Vox
// =================================================================
datum/unit_test/mob_damage/vox
name = "MOB: Vox damage check template"
mob_type = /mob/living/carbon/human/vox
datum/unit_test/mob_damage/vox/brute
name = "MOB: Vox Brute Damage Check"
damagetype = BRUTE
datum/unit_test/mob_damage/vox/fire
name = "MOB: Vox Fire Damage Check"
damagetype = BURN
datum/unit_test/mob_damage/vox/tox
name = "MOB: Vox Toxins Damage Check"
damagetype = TOX
datum/unit_test/mob_damage/vox/oxy
name = "MOB: Vox Oxygen Damage Check"
damagetype = OXY
datum/unit_test/mob_damage/vox/clone
name = "MOB: Vox Clone Damage Check"
damagetype = CLONE
expected_vulnerability = IMMUNE
datum/unit_test/mob_damage/vox/halloss
name = "MOB: Vox Halloss Damage Check"
damagetype = HALLOSS
// =================================================================
// Diona
// =================================================================
datum/unit_test/mob_damage/diona
name = "MOB: Diona damage check template"
mob_type = /mob/living/carbon/human/diona
datum/unit_test/mob_damage/diona/brute
name = "MOB: Diona Brute Damage Check"
damagetype = BRUTE
datum/unit_test/mob_damage/diona/fire
name = "MOB: Diona Fire Damage Check"
damagetype = BURN
datum/unit_test/mob_damage/diona/tox
name = "MOB: Diona Toxins Damage Check"
damagetype = TOX
datum/unit_test/mob_damage/diona/oxy
name = "MOB: Diona Oxygen Damage Check"
damagetype = OXY
expected_vulnerability = IMMUNE
datum/unit_test/mob_damage/diona/clone
name = "MOB: Diona Clone Damage Check"
damagetype = CLONE
expected_vulnerability = IMMUNE
datum/unit_test/mob_damage/diona/halloss
name = "MOB: Diona Halloss Damage Check"
damagetype = HALLOSS
expected_vulnerability = IMMUNE
// =================================================================
// SPECIAL WHITTLE SNOWFLAKES aka IPC
// =================================================================
datum/unit_test/mob_damage/machine
name = "MOB: IPC damage check template"
mob_type = /mob/living/carbon/human/machine
datum/unit_test/mob_damage/machine/brute
name = "MOB: IPC Brute Damage Check"
damagetype = BRUTE
expected_vulnerability = ARMORED
datum/unit_test/mob_damage/machine/fire
name = "MOB: IPC Fire Damage Check"
damagetype = BURN
expected_vulnerability = EXTRA_VULNERABLE
datum/unit_test/mob_damage/machine/tox
name = "MOB: IPC Toxins Damage Check"
damagetype = TOX
expected_vulnerability = IMMUNE
datum/unit_test/mob_damage/machine/oxy
name = "MOB: IPC Oxygen Damage Check"
damagetype = OXY
expected_vulnerability = IMMUNE
datum/unit_test/mob_damage/machine/clone
name = "MOB: IPC Clone Damage Check"
damagetype = CLONE
expected_vulnerability = IMMUNE
datum/unit_test/mob_damage/machine/halloss
name = "MOB: IPC Halloss Damage Check"
damagetype = HALLOSS
expected_vulnerability = IMMUNE
// =================================================================
// Vaurca Worker
// =================================================================
datum/unit_test/mob_damage/vaurca
name = "MOB: Vaurca damage check template"
mob_type = /mob/living/carbon/human/type_a
datum/unit_test/mob_damage/vaurca/brute
name = "MOB: Vaurca Brute Damage Check"
damagetype = BRUTE
expected_vulnerability = ARMORED
datum/unit_test/mob_damage/vaurca/fire
name = "MOB: Vaurca Fire Damage Check"
damagetype = BURN
expected_vulnerability = EXTRA_VULNERABLE
datum/unit_test/mob_damage/vaurca/tox
name = "MOB: Vaurca Toxins Damage Check"
damagetype = TOX
expected_vulnerability = EXTRA_VULNERABLE
datum/unit_test/mob_damage/vaurca/oxy
name = "MOB: Vaurca Oxygen Damage Check"
damagetype = OXY
expected_vulnerability = ARMORED
datum/unit_test/mob_damage/vaurca/clone
name = "MOB: Vaurca Clone Damage Check"
damagetype = CLONE
datum/unit_test/mob_damage/vaurca/halloss
name = "MOB: Vaurca Halloss Damage Check"
damagetype = HALLOSS
// ==============================================================================
datum/unit_test/robot_module_icons
name = "MOB: Robot module icon check"
var/icon_file = 'icons/mob/screen1_robot.dmi'
datum/unit_test/robot_module_icons/start_test()
var/failed = 0
if(!isicon(icon_file))
fail("[icon_file] is not a valid icon file.")
return 1
var/list/valid_states = icon_states(icon_file)
if(!valid_states.len)
return 1
for(var/i=1, i<=robot_modules.len, i++)
var/bad_msg = "[ascii_red]--------------- [robot_modules[i]]"
if(!(lowertext(robot_modules[i]) in valid_states))
log_unit_test("[bad_msg] does not contain a valid icon state in [icon_file][ascii_reset]")
failed=1
if(failed)
fail("Some icon states did not exist")
else
pass("All modules had valid icon states")
return 1
#undef VULNERABLE
#undef IMMUNE
#undef SUCCESS
#undef FAILURE