mirror of
https://github.com/PolarisSS13/Polaris.git
synced 2025-12-15 20:52:07 +00:00
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:
@@ -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."
|
||||
@@ -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."
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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 |
2337
maps/submaps/surface_submaps/wilderness/Research1.dmm
Normal file
2337
maps/submaps/surface_submaps/wilderness/Research1.dmm
Normal file
File diff suppressed because it is too large
Load Diff
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user