Files
CHOMPStation2/code/WorkInProgress/organs/organs.dm

265 lines
6.3 KiB
Plaintext

//TODO: Move cyber organs active/inactive stats to vars.
//flags for organType
#define CYBER 1
#define SPELL 2
/obj/organstructure //used obj for the "contents" var
name = "organs"
var/obj/item/weapon/cell/mainPowerCell = null //for ease of refernce for installed c. implants
var/species = "mob" //for speaking in unknown languages purposes
var/obj/organ/limb/arms/arms = null
var/obj/organ/limb/legs/legs = null
var/obj/organ/chest/chest = null
proc/FindMainPowercell()
if(chest) //priority goes to chest implant, if there is one
if((chest.organType & CYBER) && chest.canExportPower && chest.cell)
mainPowerCell = chest.cell
return
var/list/organs = GetAllContents()
for(var/obj/organ/otherOrgan in organs) //otherwise, maybe some other organ fits the criteria?
if((otherOrgan.organType & CYBER) && otherOrgan.canExportPower && otherOrgan.cell)
mainPowerCell = otherOrgan:cell
return
mainPowerCell = null //otherwise, seems there's no main cell
return
proc/GetSpeciesName()
var/list/speciesPresent = list()
for(var/obj/organ/organ in src) //only external organs count, since it's judging by the appearance
if(speciesPresent[organ.species])
speciesPresent[organ.species]++
else
speciesPresent[organ.species] = 1 //not sure, but I think it's not initialised before that, so can't ++
var/list/dominantSpecies = list()
for(var/speciesName in speciesPresent)
if(!dominantSpecies.len)
dominantSpecies += speciesName
else
if(speciesPresent[dominantSpecies[1]] == speciesPresent[speciesName])
dominantSpecies += speciesName
else if(speciesPresent[dominantSpecies[1]] < speciesPresent[speciesName])
dominantSpecies = list(speciesName)
if(!dominantSpecies.len)
species = "mob"
else
species = pick(dominantSpecies)
return
proc/RecalculateStructure()
var/list/organs = GetAllContents()
arms = locate(/obj/organ/limb/arms) in organs
legs = locate(/obj/organ/limb/legs) in organs
chest = locate(/obj/organ/chest) in organs
GetSpeciesName()
FindMainPowercell()
return
proc/ProcessOrgans()
set background = 1
var/list/organs = GetAllContents()
for(var/obj/organ/organ in organs)
organ.ProcessOrgan()
return
New()
..()
RecalculateStructure()
/obj/organstructure/human
name = "human organs"
New()
//new /obj/organ/limb/arms/human(src)
//new /obj/organ/limb/legs/human(src)
new /obj/organ/chest/human(src)
..()
/obj/organstructure/cyber
name = "cyborg organs"
New()
//new /obj/organ/limb/arms/cyber(src)
//new /obj/organ/limb/legs/cyber(src)
new /obj/organ/chest/cyber(src)
..()
/obj/organ
name = "organ"
//All types
var/organType = 0 //CYBER and SPELL go here
var/species = "mob"
var/obj/organstructure/rootOrganStructure = null
New(location)
..()
rootOrganStructure = FindRootStructure()
proc/FindRootStructure()
if(istype(loc,/obj/organ))
var/obj/organ/parent = loc
return parent.FindRootStructure()
else if(istype(loc,/obj/organstructure))
return loc
return null
proc/ProcessOrgan()
set background = 1
if(organType & CYBER)
var/hasPower = DrainPower()
if(!hasPower && active)
Deactivate()
else if(hasPower && !active)
Activate()
//CYBORG type
var/obj/item/weapon/cell/cell = null
var/canExportPower = 0 //only comes in play if it has a cell
var/active = 0
var/powerDrainPerTick = 0
proc/DrainPower()
set background = 1
if(!powerDrainPerTick)
return 1
if(cell)
if(cell.charge >= powerDrainPerTick)
cell.charge -= powerDrainPerTick
return 1
if(rootOrganStructure.mainPowerCell)
if(rootOrganStructure.mainPowerCell.charge >= powerDrainPerTick)
rootOrganStructure.mainPowerCell.charge -= powerDrainPerTick
return 1
return 0
proc/Activate() //depends on the organ, involves setting active to 1 and changing the organ's vars to reflect its "activated" state
rootOrganStructure.loc << "\blue Your [name] powers up!"
active = 1
return
proc/Deactivate() //depends on the organ, involves setting active to 0 and changing the organ's vars to reflect its "deactivated" state
rootOrganStructure.loc << "\red Your [name] powers down."
active = 0
return
/obj/organ/limb
name = "limb"
/obj/organ/limb/arms
name = "arms"
var/minDamage = 5 //punching damage
var/maxDamage = 5
// var/strangleDelay = 1 //The code is a bit too complicated for that right now
/obj/organ/limb/arms/human
name = "human arms"
species = "human"
minDamage = 1
maxDamage = 9
/obj/organ/limb/arms/cyber
name = "cyborg arms"
species = "cyborg"
organType = CYBER
powerDrainPerTick = 5
Activate()
..()
minDamage = 3
maxDamage = 14
Deactivate()
..()
minDamage = 0
maxDamage = 3
/obj/organ/limb/legs
name = "legs"
var/moveRunDelay = 1 //not sure about how that works
var/moveWalkDelay = 7
//var/knockdownResist = 0
/obj/organ/limb/legs/human
name = "human legs"
species = "human"
/obj/organ/limb/legs/cyber
name = "cyborg legs"
species = "cyborg"
organType = CYBER
powerDrainPerTick = 5
Activate()
..()
moveRunDelay = 0
moveWalkDelay = 3
Deactivate()
..()
moveRunDelay = 2
moveWalkDelay = 10
/obj/organ/chest
name = "chest"
var/maxHealth = 50 //right now, the mob's (only humans for now) health depends only on it. Will be fixed later
/obj/organ/chest/human
name = "human chest"
species = "human"
maxHealth = 100
New()
..()
new /obj/organ/limb/arms/human(src)
new /obj/organ/limb/legs/human(src)
/obj/organ/chest/cyber
name = "cyborg chest"
species = "cyborg"
organType = CYBER
canExportPower = 1
maxHealth = 150
New()
..()
cell = new /obj/item/weapon/cell/high(src)
cell.charge = cell.maxcharge
new /obj/organ/limb/arms/cyber(src)
new /obj/organ/limb/legs/cyber(src)
Activate()
..()
canExportPower = 1
maxHealth = 150
if(rootOrganStructure.loc && istype(rootOrganStructure.loc,/mob/living))
var/mob/living/holder = rootOrganStructure.loc
holder.updatehealth()
Deactivate()
..()
canExportPower = 0
maxHealth = 120
if(rootOrganStructure.loc && istype(rootOrganStructure.loc,/mob/living))
var/mob/living/holder = rootOrganStructure.loc
holder.updatehealth()