Adds Research Lab POI and some other stuff. (#9026)

* Adds random zippo lighter.

* Adds random zippo lighter part 2.

* Adds random zippo.

* first prototype of the Research POI.

* Research POI definitions.

* Adding android simplemobs.

* Adds voice lines for fleeing.

* Fix robocorpses.

* Progress as of 28-02-23.

* Progress as of 02-03-23.

* Add detailing to the map

* de-stationifying the POI a bit

* Finishes adding android drone enemies.

* Final pass on Gene Lab POI.

* Fix corpse.dm linter error.

---------

Co-authored-by: Cerebulon <tanhindmarsh@yahoo.com>
This commit is contained in:
Martin Rivard
2023-03-23 23:40:29 -04:00
committed by GitHub
parent 8ede4b4c79
commit a8b209ef93
12 changed files with 2622 additions and 4 deletions

View File

@@ -127,6 +127,130 @@
corpseidjob = "Operative"
corpseidaccess = "Syndicate"
/obj/effect/landmark/mobcorpse/android
name = "Android Drone"
var/list/brandList = list(
BP_L_HAND = "Unbranded",
BP_R_HAND = "Unbranded",
BP_L_FOOT = "Unbranded",
BP_R_FOOT = "Unbranded",
BP_L_ARM = "Unbranded",
BP_R_ARM = "Unbranded",
BP_L_LEG = "Unbranded",
BP_R_LEG = "Unbranded",
BP_HEAD = "Unbranded",
BP_TORSO = "Unbranded",
BP_GROIN = "Unbranded"
)
corpseid = 0
/obj/effect/landmark/mobcorpse/android/createCorpse()
var/mob/living/carbon/human/M = new /mob/living/carbon/human (src.loc)
M.real_name = src.name
for(var/injuries in 1 to rand(3,5))
var/deal_brute = rand(round(M.species.total_health * 0.10), round(M.species.total_health * 0.30))
M.take_overall_damage(deal_brute, "Death Trauma")
M.set_stat(DEAD) //Kills the new mob
var/obj/item/organ/internal/brain = M.internal_organs_by_name[O_BRAIN] //specific special cases
brain.digitize()
var/obj/item/organ/internal/eyes = M.internal_organs_by_name[O_EYES]
eyes.robotize()
for (var/limb in brandList)
var/obj/item/organ/external/E = M.get_organ(limb)
if(E)
E.robotize(brandList[limb])
if(src.corpseuniform)
M.equip_to_slot_or_del(new src.corpseuniform(M), slot_w_uniform)
if(src.corpsesuit)
M.equip_to_slot_or_del(new src.corpsesuit(M), slot_wear_suit)
if(src.corpseshoes)
M.equip_to_slot_or_del(new src.corpseshoes(M), slot_shoes)
if(src.corpsegloves)
M.equip_to_slot_or_del(new src.corpsegloves(M), slot_gloves)
if(src.corpseradio)
M.equip_to_slot_or_del(new src.corpseradio(M), slot_l_ear)
if(src.corpseglasses)
M.equip_to_slot_or_del(new src.corpseglasses(M), slot_glasses)
if(src.corpsemask)
M.equip_to_slot_or_del(new src.corpsemask(M), slot_wear_mask)
if(src.corpsehelmet)
M.equip_to_slot_or_del(new src.corpsehelmet(M), slot_head)
if(src.corpsebelt)
M.equip_to_slot_or_del(new src.corpsebelt(M), slot_belt)
if(src.corpsepocket1)
M.equip_to_slot_or_del(new src.corpsepocket1(M), slot_r_store)
if(src.corpsepocket2)
M.equip_to_slot_or_del(new src.corpsepocket2(M), slot_l_store)
if(src.corpseback)
M.equip_to_slot_or_del(new src.corpseback(M), slot_back)
if(src.corpseid == 1)
var/obj/item/card/id/W = new(M)
W.name = "[M.real_name]'s ID Card"
var/datum/job/jobdatum
for(var/jobtype in typesof(/datum/job))
var/datum/job/J = new jobtype
if(J.title == corpseidaccess)
jobdatum = J
break
if(src.corpseidicon)
W.icon_state = corpseidicon
if(src.corpseidaccess)
if(jobdatum)
W.access = jobdatum.get_access()
else
W.access = list()
if(corpseidjob)
W.assignment = corpseidjob
W.registered_name = M.real_name
M.equip_to_slot_or_del(W, slot_wear_id)
delete_me = 1
/obj/effect/landmark/mobcorpse/android/scientist
name = "Scientific Drone"
corpseuniform = /obj/item/clothing/under/lawyer/bluesuit
corpsesuit = /obj/item/clothing/suit/storage/toggle/labcoat
corpseshoes = /obj/item/clothing/shoes/boots/duty
brandList = list(
BP_L_HAND = "Cyber Solutions - Wight",
BP_R_HAND = "Cyber Solutions - Wight",
BP_L_FOOT = "Cyber Solutions - Wight",
BP_R_FOOT = "Cyber Solutions - Wight",
BP_L_ARM = "Cyber Solutions - Wight",
BP_R_ARM = "Cyber Solutions - Wight",
BP_L_LEG = "Cyber Solutions - Wight",
BP_R_LEG = "Cyber Solutions - Wight",
BP_HEAD = "Grayson",
BP_TORSO = "Cyber Solutions - Wight",
BP_GROIN = "Cyber Solutions - Wight"
)
/obj/effect/landmark/mobcorpse/android/combat
name = "Combat Drone"
corpseuniform = /obj/item/clothing/under/color/white
corpsesuit = /obj/item/clothing/suit/armor/vest/alt
corpseshoes = /obj/item/clothing/shoes/boots/duty
corpsegloves = /obj/item/clothing/gloves/swat
brandList = list(
BP_L_HAND = "Unbranded - Mantis Prosis",
BP_R_HAND = "Unbranded - Mantis Prosis",
BP_L_FOOT = "Unbranded - Mantis Prosis",
BP_R_FOOT = "Unbranded - Mantis Prosis",
BP_L_ARM = "Unbranded - Mantis Prosis",
BP_R_ARM = "Unbranded - Mantis Prosis",
BP_L_LEG = "Unbranded - Mantis Prosis",
BP_R_LEG = "Unbranded - Mantis Prosis",
BP_HEAD = "Hephaestus - Athena",
BP_TORSO = "Hephaestus - Athena",
BP_GROIN = "Hephaestus - Athena"
)
/obj/effect/landmark/mobcorpse/clown

View File

@@ -0,0 +1,84 @@
////////////////////////////////
// Android Simplemob AI
////////////////////////////////
/datum/ai_holder/simple_mob/humanoid/android
hostile = TRUE //enemy!
can_breakthrough = FALSE //does not break down doors
can_flee = TRUE
flee_when_dying = FALSE
outmatched_threshold = 250 //25% higher threshold than usual - so it doesn't run from solo players
threaten_delay = 15 SECONDS
call_distance = 3
/datum/ai_holder/simple_mob/humanoid/android/violent
can_flee = FALSE
call_distance = 6 //higher communication distance
can_breakthrough = TRUE //Can break through doors
threaten_delay = 10 SECONDS
var/run_if_this_close = 4 //will be aggressive
/mob/living/simple_mob/humanoid/android/isSynthetic()
return TRUE
/mob/living/simple_mob/humanoid/android
name = "android drone"
desc = "A humanoid robot - a marking on the side of its head denotes its status as a C-class drone."
icon_state = "robocombat"
icon_living = "robocombat"
corpse = /obj/effect/landmark/mobcorpse/android
say_list_type = /datum/say_list/hivebot
ai_holder_type = /datum/ai_holder/simple_mob/humanoid/android
faction = "drone"
mob_class = MOB_CLASS_SYNTHETIC
min_oxy = 0
max_oxy = 0
min_tox = 0
max_tox = 0
min_co2 = 0
max_co2 = 0
min_n2 = 0
max_n2 = 0
minbodytemp = 0
armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 100) //slightly tougher in melee but otherwise just basic resistances that make sense
taser_kill = FALSE
poison_resist = 1.0
shock_resist = -0.5
/mob/living/simple_mob/humanoid/android/combat //concept is they are a bit more accurate, tougher, hit harder, but most importantly are way more aggressive
name = "combat unit"
desc = "An autonomous humanoid drone that was evidently built for combat."
icon_state = "robocombat"
icon_living = "robocombat"
ai_holder_type = /datum/ai_holder/simple_mob/humanoid/android/violent
corpse = /obj/effect/landmark/mobcorpse/android/combat
armor = list(melee = 30, bullet = 20, laser = 20, energy = 10, bomb = 10, bio = 100, rad = 100)
projectiletype = /obj/item/projectile/beam/burstlaser //30 damage, 10 AP
projectilesound = 'sound/weapons/Laser.ogg'
loot_list = list(/obj/item/gun/energy/gun/compact = 80)
projectile_dispersion = 6
projectile_accuracy = -25
reload_max = 10
needs_reload = TRUE
reload_time = 4 SECONDS
/mob/living/simple_mob/humanoid/android/scientist
name = "scientific drone"
desc = "A humanoid drone outfitted to perform some kind of scientific experiments."
icon_state = "roboscientist"
icon_living = "roboscientist"
corpse = /obj/effect/landmark/mobcorpse/android/scientist
say_list_type = /datum/say_list/android_scientist
projectiletype = /obj/item/projectile/bullet/pistol //25 damage
loot_list = list(/obj/item/gun/projectile/p92x = 80, /datum/category_item/autolathe/arms/pistol_9mm = 30)
projectile_dispersion = 7
projectile_accuracy = -30
needs_reload = TRUE
reload_max = 8
reload_time = 5 SECONDS

View File

@@ -331,6 +331,7 @@
return TRUE
////////////////////////////////
// Space Mercs
////////////////////////////////
@@ -386,6 +387,10 @@
/mob/living/simple_mob/humanoid/merc/ranged/space/Process_Spacemove(var/check_drift = 0)
return
////////////////////////////////
// PoI Mercs
////////////////////////////////