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

@@ -114,4 +114,10 @@
icon_state = "yellow-1"
catalogue_data = list(/datum/category_item/catalogue/information/objects/growthcanister)
anchored = 0
density = 1
density = 1
/mob/living/carbon/human/monkey/simeon/Initialize()
. = ..()
name = "Simeon"
real_name = name
desc = "This lab monkey has a certain glint in their eye."

View File

@@ -890,6 +890,26 @@
prob(5);/obj/item/clothing/head/helmet/space/void/scg/heavy
)
/obj/random/zippo
name = "Random Zippo Lighter"
desc = "This is a random Zippo lighter."
/obj/random/zippo/item_to_spawn()
return pick(
prob(50);/obj/item/flame/lighter/zippo,
prob(5);/obj/item/flame/lighter/zippo/black,
prob(5);/obj/item/flame/lighter/zippo/blue,
prob(10);/obj/item/flame/lighter/zippo/capitalist,
prob(10);/obj/item/flame/lighter/zippo/communist,
prob(5);/obj/item/flame/lighter/zippo/engraved,
prob(5);/obj/item/flame/lighter/zippo/gold,
prob(5);/obj/item/flame/lighter/zippo/gonzo,
prob(5);/obj/item/flame/lighter/zippo/moff,
prob(5);/obj/item/flame/lighter/zippo/rainbow,
prob(5);/obj/item/flame/lighter/zippo/red,
prob(5);/obj/item/flame/lighter/zippo/royal
)
/obj/random/dufflebag
desc = "This is a random non-department-specific dufflebag."

View File

@@ -41,5 +41,6 @@
return
ai_log("flee_from_target() : Stepping away.", AI_LOG_TRACE)
delayed_say(safepick(holder.say_list.say_retreat))
step_away(holder, target, vision_range)
ai_log("flee_from_target() : Exiting.", AI_LOG_DEBUG)
ai_log("flee_from_target() : Exiting.", AI_LOG_DEBUG)

View File

@@ -31,6 +31,7 @@
var/list/say_threaten = list() // When threatening someone.
var/list/say_stand_down = list() // When the threatened thing goes away.
var/list/say_escalate = list() // When the threatened thing doesn't go away.
var/list/say_retreat = list()
var/threaten_sound = null // Sound file played when the mob's AI calls threaten_target() for the first time.
var/stand_down_sound = null // Sound file played when the mob's AI loses sight of the threatened target.
@@ -54,6 +55,7 @@
say_threaten = list("You best leave, this booty is mine.", "No plank to walk on, just walk away.")
say_stand_down = list("Good.")
say_escalate = list("Yarr! The booty is mine!")
say_retreat = list("I be retreating, matey!")
// Mercs!
/datum/say_list/merc
@@ -71,7 +73,29 @@
say_threaten = list("Get out of here!", "Hey! Private Property!")
say_stand_down = list("Good.")
say_escalate = list("Your funeral!", "Bring it!")
say_retreat = list("Fuck! Pulling back!", "Shit!", "Oh, hell!")
threaten_sound = 'sound/weapons/TargetOn.ogg'
stand_down_sound = 'sound/weapons/TargetOff.ogg'
/datum/say_list/android_scientist
speak = list(
"Resuming task: Collect data.",
"No anomalies found.",
"Error: No data sources found."
)
emote_hear = list("beeps quietly", "emits a soft buzz", "whirrs idly")
emote_see = list("scans the area", "focuses on an object", "shifts in place")
say_understood = list("Confirmed.", "Acknowledged.")
say_cannot = list("Declined.", "Refused.")
say_maybe_target = list("Unknown entity detected. Investigating.", "Possible breach detected.", "Investigating.")
say_got_target = list("Threat detected.", "Defending facility.", "Engaging target.")
say_threaten = list("Unknown entity: Present authorization.", "Unknown entity. Scanning.")
say_stand_down = list("Stand-down accepted. Disengaging.")
say_escalate = list("Threat detected. Rectifying.", "Verification expired. Engaging.")
say_retreat = list("Disengaging.")
threaten_sound = 'sound/weapons/TargetOn.ogg'
stand_down_sound = 'sound/weapons/TargetOff.ogg'
@@ -114,9 +138,14 @@
say_cannot = list("Denied.", "Negative.")
say_maybe_target = list("Possible threat detected. Investigating.", "Motion detected.", "Investigating.")
say_got_target = list("Threat detected.", "New task: Remove threat.", "Threat removal engaged.", "Engaging target.")
say_threaten = list("Warning: Vacate area.", "Warning to threat: Will engage lethally.")
say_stand_down = list("Stand-down accepted. Disengaging.")
say_escalate = list("Warning expired. Engaging.", "Threat removal engaged.")
say_retreat = list("Disengaging.")
/datum/say_list/lizard
emote_hear = list("hisses")
/datum/say_list/crab
emote_hear = list("hisses")
emote_hear = list("hisses")

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
////////////////////////////////

Binary file not shown.

Before

Width:  |  Height:  |  Size: 338 KiB

After

Width:  |  Height:  |  Size: 340 KiB

File diff suppressed because it is too large Load Diff

View File

@@ -348,3 +348,9 @@
desc = "Gathering of acolytes gone wrong."
mappath = 'maps/submaps/surface_submaps/wilderness/deathden.dmm'
cost = 15
/datum/map_template/surface/wilderness/deep/Research
name = "Gene Research Lab"
desc = "A covert gene research lab guarded by combat drones."
mappath = 'maps/submaps/surface_submaps/wilderness/Research1.dmm'
cost = 30

View File

@@ -182,3 +182,8 @@
/area/submap/DeathDen
name = "POI - Death Den"
ambience = AMBIENCE_FOREBODING
/area/submap/Research1
name = "POI - Gene Lab"
ambience = AMBIENCE_HIGHSEC
requires_power = FALSE

View File

@@ -2537,6 +2537,7 @@
#include "code\modules\mob\living\simple_mob\subtypes\animal\space\worm.dm"
#include "code\modules\mob\living\simple_mob\subtypes\blob\blob.dm"
#include "code\modules\mob\living\simple_mob\subtypes\blob\spore.dm"
#include "code\modules\mob\living\simple_mob\subtypes\humanoid\android.dm"
#include "code\modules\mob\living\simple_mob\subtypes\humanoid\clown.dm"
#include "code\modules\mob\living\simple_mob\subtypes\humanoid\humanoid.dm"
#include "code\modules\mob\living\simple_mob\subtypes\humanoid\pirates.dm"