Dynamic Human Icon Generation For Simple/Basic Mobs (& Cardboard Cutouts) (#72517)
## About The Pull Request revive of #68760 this time a proc, not an element this time supports cardboard cutouts this time supports mob corpses  ## Why It's Good For The Game prevents these icons ever being outdated, they'll always look what they are supposed to, saves spriting work ## Changelog 🆑 Fikou, a hood by Viro refactor: humanoid mobs and cardboard cutouts automatically generate their sprites, they no longer will be outdated /🆑 Co-authored-by: Time-Green <timkoster1@hotmail.com>
@@ -5958,10 +5958,7 @@
|
||||
/area/centcom/central_command_areas/evacuation)
|
||||
"Cg" = (
|
||||
/obj/item/cardboard_cutout{
|
||||
desc = "They seem to be ignoring you... Typical.";
|
||||
dir = 1;
|
||||
icon_state = "cutout_ntsec";
|
||||
name = "Private Security Officer"
|
||||
starting_cutout = "Private Security Officer"
|
||||
},
|
||||
/obj/effect/turf_decal/tile/red{
|
||||
dir = 1
|
||||
@@ -8855,9 +8852,7 @@
|
||||
/area/centcom/central_command_areas/admin)
|
||||
"UA" = (
|
||||
/obj/item/cardboard_cutout{
|
||||
desc = "They seem to be ignoring you... Typical.";
|
||||
icon_state = "cutout_ntsec";
|
||||
name = "Private Security Officer"
|
||||
starting_cutout = "Private Security Officer"
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral/fourcorners,
|
||||
/turf/open/floor/iron/dark,
|
||||
|
||||
@@ -301,7 +301,7 @@
|
||||
melee_damage_lower = 11;
|
||||
melee_damage_upper = 11;
|
||||
name = "Rotting Carcass";
|
||||
zombiejob = "Assistant"
|
||||
outfit = /datum/outfit/corpse_assistant
|
||||
},
|
||||
/turf/open/floor/iron/white/corner{
|
||||
dir = 1
|
||||
@@ -1546,7 +1546,7 @@
|
||||
melee_damage_lower = 11;
|
||||
melee_damage_upper = 11;
|
||||
name = "Rotting Carcass";
|
||||
zombiejob = "Assistant"
|
||||
outfit = /datum/outfit/corpse_assistant
|
||||
},
|
||||
/turf/open/floor/iron,
|
||||
/area/shuttle/abandoned/medbay)
|
||||
|
||||
@@ -74,7 +74,7 @@
|
||||
melee_damage_lower = 11;
|
||||
melee_damage_upper = 11;
|
||||
name = "Rotting Carcass";
|
||||
zombiejob = "Assistant"
|
||||
outfit = /datum/outfit/corpse_assistant
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/abandoned/engine)
|
||||
@@ -299,7 +299,7 @@
|
||||
melee_damage_lower = 11;
|
||||
melee_damage_upper = 11;
|
||||
name = "Rotting Carcass";
|
||||
zombiejob = "Assistant"
|
||||
outfit = /datum/outfit/corpse_assistant
|
||||
},
|
||||
/turf/open/floor/mineral/titanium,
|
||||
/area/shuttle/abandoned/engine)
|
||||
@@ -531,7 +531,7 @@
|
||||
melee_damage_lower = 11;
|
||||
melee_damage_upper = 11;
|
||||
name = "Rotting Carcass";
|
||||
zombiejob = "Assistant"
|
||||
outfit = /datum/outfit/corpse_assistant
|
||||
},
|
||||
/turf/open/floor/mineral/plastitanium,
|
||||
/area/shuttle/abandoned/bridge)
|
||||
|
||||
@@ -3,10 +3,7 @@
|
||||
/turf/open/floor/holofloor/plating,
|
||||
/area/template_noop)
|
||||
"c" = (
|
||||
/obj/item/cardboard_cutout/adaptive{
|
||||
icon_state = "cutout_greytide";
|
||||
name = "White Pawn"
|
||||
},
|
||||
/obj/structure/chess/checker/whiteman,
|
||||
/turf/open/floor/holofloor/dark,
|
||||
/area/template_noop)
|
||||
"d" = (
|
||||
@@ -19,37 +16,13 @@
|
||||
/turf/open/floor/holofloor/plating,
|
||||
/area/template_noop)
|
||||
"g" = (
|
||||
/obj/item/cardboard_cutout/adaptive{
|
||||
icon_state = "cutout_clown";
|
||||
name = "White King"
|
||||
},
|
||||
/obj/item/cardboard_cutout/adaptive{
|
||||
icon_state = "cutout_clown";
|
||||
name = "White King"
|
||||
},
|
||||
/obj/item/cardboard_cutout/adaptive{
|
||||
icon_state = "cutout_clown";
|
||||
name = "White King"
|
||||
},
|
||||
/obj/item/cardboard_cutout/adaptive{
|
||||
icon_state = "cutout_clown";
|
||||
name = "White King"
|
||||
},
|
||||
/obj/item/cardboard_cutout/adaptive{
|
||||
icon_state = "cutout_clown";
|
||||
name = "White King"
|
||||
},
|
||||
/obj/effect/turf_decal/board_letter/h{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/holofloor/plating,
|
||||
/area/template_noop)
|
||||
"i" = (
|
||||
/obj/item/cardboard_cutout/adaptive{
|
||||
color = "#9999BB";
|
||||
icon_state = "cutout_greytide";
|
||||
name = "Black Pawn"
|
||||
},
|
||||
/obj/structure/chess/checker/blackman,
|
||||
/obj/effect/turf_decal/board_letter/f{
|
||||
dir = 1
|
||||
},
|
||||
@@ -81,11 +54,16 @@
|
||||
},
|
||||
/turf/open/floor/holofloor/plating,
|
||||
/area/template_noop)
|
||||
"q" = (
|
||||
/obj/structure/chess/checker/whiteking,
|
||||
/obj/structure/chess/checker/whiteking,
|
||||
/obj/structure/chess/checker/whiteking,
|
||||
/obj/structure/chess/checker/whiteking,
|
||||
/obj/structure/chess/checker/whiteking,
|
||||
/turf/open/floor/holofloor/plating,
|
||||
/area/template_noop)
|
||||
"r" = (
|
||||
/obj/item/cardboard_cutout/adaptive{
|
||||
icon_state = "cutout_greytide";
|
||||
name = "White Pawn"
|
||||
},
|
||||
/obj/structure/chess/checker/whiteman,
|
||||
/obj/effect/turf_decal/board_number/two{
|
||||
dir = 4
|
||||
},
|
||||
@@ -122,31 +100,11 @@
|
||||
/turf/open/floor/holofloor/plating,
|
||||
/area/template_noop)
|
||||
"z" = (
|
||||
/obj/item/cardboard_cutout/adaptive{
|
||||
color = "#9999BB";
|
||||
icon_state = "cutout_clown";
|
||||
name = "Black King"
|
||||
},
|
||||
/obj/item/cardboard_cutout/adaptive{
|
||||
color = "#9999BB";
|
||||
icon_state = "cutout_clown";
|
||||
name = "Black King"
|
||||
},
|
||||
/obj/item/cardboard_cutout/adaptive{
|
||||
color = "#9999BB";
|
||||
icon_state = "cutout_clown";
|
||||
name = "Black King"
|
||||
},
|
||||
/obj/item/cardboard_cutout/adaptive{
|
||||
color = "#9999BB";
|
||||
icon_state = "cutout_clown";
|
||||
name = "Black King"
|
||||
},
|
||||
/obj/item/cardboard_cutout/adaptive{
|
||||
color = "#9999BB";
|
||||
icon_state = "cutout_clown";
|
||||
name = "Black King"
|
||||
},
|
||||
/obj/structure/chess/checker/blackking,
|
||||
/obj/structure/chess/checker/blackking,
|
||||
/obj/structure/chess/checker/blackking,
|
||||
/obj/structure/chess/checker/blackking,
|
||||
/obj/structure/chess/checker/blackking,
|
||||
/turf/open/floor/holofloor/plating,
|
||||
/area/template_noop)
|
||||
"A" = (
|
||||
@@ -158,11 +116,7 @@
|
||||
},
|
||||
/area/template_noop)
|
||||
"B" = (
|
||||
/obj/item/cardboard_cutout/adaptive{
|
||||
color = "#9999BB";
|
||||
icon_state = "cutout_greytide";
|
||||
name = "Black Pawn"
|
||||
},
|
||||
/obj/structure/chess/checker/blackman,
|
||||
/obj/effect/turf_decal/board_letter/h{
|
||||
dir = 1
|
||||
},
|
||||
@@ -223,19 +177,11 @@
|
||||
/turf/open/floor/holofloor/dark,
|
||||
/area/template_noop)
|
||||
"M" = (
|
||||
/obj/item/cardboard_cutout/adaptive{
|
||||
color = "#9999BB";
|
||||
icon_state = "cutout_greytide";
|
||||
name = "Black Pawn"
|
||||
},
|
||||
/obj/structure/chess/checker/blackman,
|
||||
/turf/open/floor/holofloor/dark,
|
||||
/area/template_noop)
|
||||
"N" = (
|
||||
/obj/item/cardboard_cutout/adaptive{
|
||||
color = "#9999BB";
|
||||
icon_state = "cutout_greytide";
|
||||
name = "Black Pawn"
|
||||
},
|
||||
/obj/structure/chess/checker/blackman,
|
||||
/obj/effect/turf_decal/board_number/six{
|
||||
dir = 4
|
||||
},
|
||||
@@ -256,22 +202,14 @@
|
||||
/turf/open/floor/holofloor/plating,
|
||||
/area/template_noop)
|
||||
"T" = (
|
||||
/obj/item/cardboard_cutout/adaptive{
|
||||
color = "#9999BB";
|
||||
icon_state = "cutout_greytide";
|
||||
name = "Black Pawn"
|
||||
},
|
||||
/obj/structure/chess/checker/blackman,
|
||||
/obj/effect/turf_decal/board_letter/b{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/holofloor/dark,
|
||||
/area/template_noop)
|
||||
"V" = (
|
||||
/obj/item/cardboard_cutout/adaptive{
|
||||
color = "#9999BB";
|
||||
icon_state = "cutout_greytide";
|
||||
name = "Black Pawn"
|
||||
},
|
||||
/obj/structure/chess/checker/blackman,
|
||||
/obj/effect/turf_decal/board_letter/d{
|
||||
dir = 1
|
||||
},
|
||||
@@ -309,7 +247,7 @@
|
||||
/area/template_noop)
|
||||
|
||||
(1,1,1) = {"
|
||||
a
|
||||
z
|
||||
Y
|
||||
w
|
||||
G
|
||||
@@ -318,7 +256,7 @@ k
|
||||
K
|
||||
v
|
||||
x
|
||||
a
|
||||
q
|
||||
"}
|
||||
(2,1,1) = {"
|
||||
a
|
||||
@@ -405,7 +343,7 @@ c
|
||||
P
|
||||
"}
|
||||
(9,1,1) = {"
|
||||
z
|
||||
a
|
||||
B
|
||||
n
|
||||
N
|
||||
|
||||
@@ -74,9 +74,7 @@
|
||||
"o" = (
|
||||
/obj/structure/chair/comfy/black,
|
||||
/obj/item/cardboard_cutout{
|
||||
desc = "A cardboard cutout of a xenomorph maid.";
|
||||
icon_state = "cutout_lusty";
|
||||
name = "lusty xenomorph maid"
|
||||
starting_cutout = "Xenomorph Maid"
|
||||
},
|
||||
/obj/structure/window/reinforced/survival_pod{
|
||||
dir = 1
|
||||
|
||||
@@ -771,3 +771,6 @@
|
||||
/// Checking flags for [/mob/proc/can_read()]
|
||||
#define READING_CHECK_LITERACY (1<<0)
|
||||
#define READING_CHECK_LIGHT (1<<1)
|
||||
|
||||
/// In dynamic human icon gen we don't replace the held item.
|
||||
#define NO_REPLACE 0
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
///Global list of all dynamically generated icons, for caching, so we don't have to generate multiple times.
|
||||
GLOBAL_LIST_EMPTY(dynamic_human_icons)
|
||||
|
||||
///This proc takes an amount of arguments and creates a human dummy using the paths, for visuals you want!
|
||||
/proc/get_dynamic_human_icon(outfit_path, species_path = /datum/species/human, mob_spawn_path, r_hand, l_hand, bloody_slots = NONE, list/generated_dirs = GLOB.cardinals, animated = TRUE)
|
||||
if(!species_path)
|
||||
return FALSE
|
||||
var/arg_string = "[outfit_path]_[species_path]_[mob_spawn_path]_[l_hand]_[r_hand]_[bloody_slots]_[generated_dirs.Join(",")]"
|
||||
if(GLOB.dynamic_human_icons[arg_string]) //if already exists in our cache, just return that
|
||||
return GLOB.dynamic_human_icons[arg_string]
|
||||
var/mob/living/carbon/human/dummy/consistent/dummy = new()
|
||||
dummy.set_species(species_path)
|
||||
dummy.stat = DEAD //this is to avoid side effects of mob spawners
|
||||
dummy.underwear = "Nude"
|
||||
dummy.undershirt = "Nude"
|
||||
dummy.socks = "Nude"
|
||||
if(outfit_path)
|
||||
var/datum/outfit/outfit = new outfit_path()
|
||||
if(r_hand != NO_REPLACE) //we can still override to be null, no replace means just use outfit's
|
||||
outfit.r_hand = r_hand
|
||||
if(l_hand != NO_REPLACE)
|
||||
outfit.l_hand = l_hand
|
||||
dummy.equipOutfit(outfit)
|
||||
else if(mob_spawn_path)
|
||||
var/obj/effect/mob_spawn/spawner = new mob_spawn_path(null, TRUE)
|
||||
spawner.outfit_override = list()
|
||||
if(r_hand != NO_REPLACE)
|
||||
spawner.outfit_override["r_hand"] = r_hand
|
||||
if(l_hand != NO_REPLACE)
|
||||
spawner.outfit_override["l_hand"] = l_hand
|
||||
spawner.special(dummy, dummy)
|
||||
spawner.equip(dummy)
|
||||
for(var/obj/item/carried_item in dummy)
|
||||
if(dummy.is_holding(carried_item))
|
||||
var/datum/component/two_handed/twohanded = carried_item.GetComponent(/datum/component/two_handed)
|
||||
if(twohanded)
|
||||
twohanded.wield(dummy)
|
||||
var/datum/component/transforming/transforming = carried_item.GetComponent(/datum/component/transforming)
|
||||
if(transforming)
|
||||
transforming.set_active(carried_item)
|
||||
if(bloody_slots & carried_item.slot_flags)
|
||||
carried_item.add_mob_blood(dummy)
|
||||
dummy.update_held_items()
|
||||
var/icon/output = icon('icons/blanks/32x32.dmi', "nothing")
|
||||
for(var/direction in generated_dirs)
|
||||
var/icon/partial = getFlatIcon(dummy, defdir = direction, no_anim = !animated)
|
||||
output.Insert(partial, dir = direction)
|
||||
GLOB.dynamic_human_icons[arg_string] = output
|
||||
qdel(dummy)
|
||||
return output
|
||||
|
||||
///This exists to apply the icons async, as that cannot be done in Initialize because of possible sleeps.
|
||||
/proc/apply_dynamic_human_icon(atom/target, outfit_path, species_path = /datum/species/human, mob_spawn_path, r_hand, l_hand, bloody_slots = NONE, generated_dirs = GLOB.cardinals)
|
||||
INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(set_dynamic_human_icon), args)
|
||||
|
||||
///This proc gets an argument of a target and runs
|
||||
/proc/set_dynamic_human_icon(list/arguments)
|
||||
var/atom/target = arguments[1] //1st argument is the target
|
||||
var/icon/dynamic_icon = get_dynamic_human_icon(arglist(arguments.Copy(2))) //the rest of the arguments starting from 2 matter to the proc
|
||||
target.icon = dynamic_icon
|
||||
@@ -356,7 +356,7 @@
|
||||
outfit_type = /datum/outfit/job/captain
|
||||
|
||||
/datum/preset_holoimage/nanotrasenprivatesecurity
|
||||
outfit_type = /datum/outfit/nanotrasensoldiercorpse2
|
||||
outfit_type = /datum/outfit/nanotrasensoldiercorpse
|
||||
|
||||
/datum/preset_holoimage/hivebot
|
||||
nonhuman_mobtype = /mob/living/simple_animal/hostile/hivebot
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
///Global list of all cardboard cutout datums, cached by name to instance.
|
||||
GLOBAL_LIST(cardboard_cutouts)
|
||||
|
||||
//Cardboard cutouts! They're man-shaped and can be colored with a crayon to look like a human in a certain outfit, although it's limited, discolored, and obvious to more than a cursory glance.
|
||||
/obj/item/cardboard_cutout
|
||||
name = "cardboard cutout"
|
||||
@@ -6,35 +9,26 @@
|
||||
icon_state = "cutout_basic"
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
resistance_flags = FLAMMABLE
|
||||
/// Possible restyles for the cutout, add an entry in change_appearance() if you add to here
|
||||
var/list/possible_appearances = list()
|
||||
item_flags = NO_PIXEL_RANDOM_DROP
|
||||
/// If the cutout is pushed over and has to be righted
|
||||
var/pushed_over = FALSE
|
||||
/// If the cutout actually appears as what it portray and not a discolored version
|
||||
var/deceptive = FALSE
|
||||
/// What cutout datum we spawn at the start? Uses the name, not the path.
|
||||
var/starting_cutout
|
||||
|
||||
/obj/item/cardboard_cutout/Initialize(mapload)
|
||||
. = ..()
|
||||
possible_appearances = sort_list(list(
|
||||
JOB_ASSISTANT = image(icon = src.icon, icon_state = "cutout_greytide"),
|
||||
"Clown" = image(icon = src.icon, icon_state = "cutout_clown"),
|
||||
"Mime" = image(icon = src.icon, icon_state = "cutout_mime"),
|
||||
"Traitor" = image(icon = src.icon, icon_state = "cutout_traitor"),
|
||||
"Nuke Op" = image(icon = src.icon, icon_state = "cutout_fluke"),
|
||||
"Cultist" = image(icon = src.icon, icon_state = "cutout_cultist"),
|
||||
"Clockwork Cultist" = image(icon = src.icon, icon_state = "cutout_servant"),
|
||||
"Revolutionary" = image(icon = src.icon, icon_state = "cutout_viva"),
|
||||
"Wizard" = image(icon = src.icon, icon_state = "cutout_wizard"),
|
||||
"Nightmare" = image(icon = src.icon, icon_state = "cutout_nightmare"),
|
||||
"Xenomorph" = image(icon = src.icon, icon_state = "cutout_fukken_xeno"),
|
||||
"Xenomorph Maid" = image(icon = src.icon, icon_state = "cutout_lusty"),
|
||||
"Ash Walker" = image(icon = src.icon, icon_state = "cutout_free_antag"),
|
||||
"Deathsquad Officer" = image(icon = src.icon, icon_state = "cutout_deathsquad"),
|
||||
"Ian" = image(icon = src.icon, icon_state = "cutout_ian"),
|
||||
"Slaughter Demon" = image(icon = 'icons/mob/simple/mob.dmi', icon_state = "daemon"),
|
||||
"Laughter Demon" = image(icon = 'icons/mob/simple/mob.dmi', icon_state = "bowmon"),
|
||||
"Private Security Officer" = image(icon = src.icon, icon_state = "cutout_ntsec")
|
||||
))
|
||||
if(!GLOB.cardboard_cutouts)
|
||||
INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(generate_cardboard_cutouts))
|
||||
if(starting_cutout)
|
||||
return INITIALIZE_HINT_LATELOAD
|
||||
|
||||
/obj/item/cardboard_cutout/LateInitialize()
|
||||
var/datum/cardboard_cutout/cutout = GLOB.cardboard_cutouts[starting_cutout]
|
||||
if(!cutout)
|
||||
CRASH("Given invalid starting_cutout! [starting_cutout]")
|
||||
cutout.apply(src)
|
||||
|
||||
//ATTACK HAND IGNORING PARENT RETURN VALUE
|
||||
/obj/item/cardboard_cutout/attack_hand(mob/living/user, list/modifiers)
|
||||
@@ -100,6 +94,10 @@
|
||||
* * user The mob choosing a skin of the cardboard cutout
|
||||
*/
|
||||
/obj/item/cardboard_cutout/proc/change_appearance(obj/item/toy/crayon/crayon, mob/living/user)
|
||||
var/list/possible_appearances = list()
|
||||
for(var/cutout_name in GLOB.cardboard_cutouts)
|
||||
var/datum/cardboard_cutout/cutout = GLOB.cardboard_cutouts[cutout_name]
|
||||
possible_appearances[cutout_name] = image(icon = cutout.applied_icon)
|
||||
var/new_appearance = show_radial_menu(user, src, possible_appearances, custom_check = CALLBACK(src, PROC_REF(check_menu), user, crayon), radius = 36, require_near = TRUE)
|
||||
if(!new_appearance)
|
||||
return FALSE
|
||||
@@ -114,85 +112,8 @@
|
||||
icon = initial(icon)
|
||||
if(!deceptive)
|
||||
add_atom_colour("#FFD7A7", FIXED_COLOUR_PRIORITY)
|
||||
switch(new_appearance)
|
||||
if(JOB_ASSISTANT)
|
||||
name = "[pick(GLOB.first_names_male)] [pick(GLOB.last_names)]"
|
||||
desc = "A cardboat cutout of an assistant."
|
||||
icon_state = "cutout_greytide"
|
||||
if("Clown")
|
||||
name = pick(GLOB.clown_names)
|
||||
desc = "A cardboard cutout of a clown. You get the feeling that it should be in a corner."
|
||||
icon_state = "cutout_clown"
|
||||
if("Mime")
|
||||
name = pick(GLOB.mime_names)
|
||||
desc = "...(A cardboard cutout of a mime.)"
|
||||
icon_state = "cutout_mime"
|
||||
if("Traitor")
|
||||
name = "[pick("Unknown", "Captain")]"
|
||||
desc = "A cardboard cutout of a traitor."
|
||||
icon_state = "cutout_traitor"
|
||||
if("Nuke Op")
|
||||
name = "[pick("Unknown", "COMMS", "Telecomms", "AI", "stealthy op", "STEALTH", "sneakybeaky", "MEDIC", "Medic")]"
|
||||
desc = "A cardboard cutout of a nuclear operative."
|
||||
icon_state = "cutout_fluke"
|
||||
if("Cultist")
|
||||
name = "Unknown"
|
||||
desc = "A cardboard cutout of a cultist."
|
||||
icon_state = "cutout_cultist"
|
||||
if("Clockwork Cultist")
|
||||
name = "[pick(GLOB.first_names_male)] [pick(GLOB.last_names)]"
|
||||
desc = "A cardboard cutout of a servant of Ratvar."
|
||||
icon_state = "cutout_servant"
|
||||
if("Revolutionary")
|
||||
name = "Unknown"
|
||||
desc = "A cardboard cutout of a revolutionary."
|
||||
icon_state = "cutout_viva"
|
||||
if("Wizard")
|
||||
name = "[pick(GLOB.wizard_first)], [pick(GLOB.wizard_second)]"
|
||||
desc = "A cardboard cutout of a wizard."
|
||||
icon_state = "cutout_wizard"
|
||||
if("Nightmare")
|
||||
name = "[pick(GLOB.nightmare_names)]"
|
||||
desc = "A cardboard cutout of a nightmare."
|
||||
icon_state = "cutout_nightmare"
|
||||
if("Xenomorph")
|
||||
name = "alien hunter ([rand(1, 999)])"
|
||||
desc = "A cardboard cutout of a xenomorph."
|
||||
icon_state = "cutout_fukken_xeno"
|
||||
if(prob(25))
|
||||
alpha = 75 //Spooky sneaking!
|
||||
if("Xenomorph Maid")
|
||||
name = "lusty xenomorph maid ([rand(1, 999)])"
|
||||
desc = "A cardboard cutout of a xenomorph maid."
|
||||
icon_state = "cutout_lusty"
|
||||
if("Ash Walker")
|
||||
name = lizard_name(pick(MALE, FEMALE))
|
||||
desc = "A cardboard cutout of an ash walker."
|
||||
icon_state = "cutout_free_antag"
|
||||
if("Deathsquad Officer")
|
||||
name = pick(GLOB.commando_names)
|
||||
desc = "A cardboard cutout of a death commando."
|
||||
icon_state = "cutout_deathsquad"
|
||||
if("Ian")
|
||||
name = "Ian"
|
||||
desc = "A cardboard cutout of the HoP's beloved corgi."
|
||||
icon_state = "cutout_ian"
|
||||
if("Slaughter Demon")
|
||||
name = "slaughter demon"
|
||||
desc = "A cardboard cutout of a slaughter demon."
|
||||
icon = 'icons/mob/simple/mob.dmi'
|
||||
icon_state = "daemon"
|
||||
if("Laughter Demon")
|
||||
name = "laughter demon"
|
||||
desc = "A cardboard cutout of a laughter demon."
|
||||
icon = 'icons/mob/simple/mob.dmi'
|
||||
icon_state = "bowmon"
|
||||
if("Private Security Officer")
|
||||
name = "Private Security Officer"
|
||||
desc = "A cardboard cutout of a private security officer."
|
||||
icon_state = "cutout_ntsec"
|
||||
else
|
||||
return FALSE
|
||||
var/datum/cardboard_cutout/cutout = GLOB.cardboard_cutouts[new_appearance]
|
||||
cutout.apply(src)
|
||||
return TRUE
|
||||
|
||||
/**
|
||||
@@ -219,9 +140,195 @@
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/item/cardboard_cutout/setDir(newdir)
|
||||
newdir = SOUTH
|
||||
return ..()
|
||||
|
||||
/obj/item/cardboard_cutout/adaptive //Purchased by Syndicate agents, these cutouts are indistinguishable from normal cutouts but aren't discolored when their appearance is changed
|
||||
deceptive = TRUE
|
||||
|
||||
///Proc that returns a list of all the cardboard cutouts (we create all subtypes) to be used in the global list.
|
||||
/proc/generate_cardboard_cutouts()
|
||||
var/list/cutouts = list()
|
||||
for(var/datum/cardboard_cutout/cutout as anything in subtypesof(/datum/cardboard_cutout))
|
||||
cutout = new cutout()
|
||||
cutouts[cutout.name] = cutout
|
||||
GLOB.cardboard_cutouts = cutouts
|
||||
|
||||
/datum/cardboard_cutout
|
||||
/// Name of the cutout, used for radial selection and the global list.
|
||||
var/name = "Boardjak"
|
||||
/// The icon we apply to the cardboard cutout.
|
||||
var/applied_icon = null
|
||||
/// The base name we actually give to to the cardboard cutout. Can be overridden in get_name().
|
||||
var/applied_name = "boardjak"
|
||||
/// The desc we give to the cardboard cutout.
|
||||
var/applied_desc = "A cardboard cutout of a boardjak."
|
||||
/// If we're not using dynamic generation (for non-humans), we can set a direct icon to give.
|
||||
var/direct_icon = null
|
||||
/// Same as direct_icon, but icon_state!
|
||||
var/direct_icon_state = ""
|
||||
/// If we're using dynamic generation, the outfit the generated mob will have.
|
||||
var/outfit = null
|
||||
/// If we're using dynamic generation, the right hand item the generated mob will have.
|
||||
var/r_hand = NO_REPLACE
|
||||
/// If we're using dynamic generation, the left hand item the generated mob will have.
|
||||
var/l_hand = NO_REPLACE
|
||||
/// If we're using dynamic generation, the mob spawner the generated mob will base visuals from.
|
||||
var/mob_spawner = null
|
||||
/// If we're using dynamic generation, the species of the generated mob.
|
||||
var/species = /datum/species/human
|
||||
|
||||
/datum/cardboard_cutout/New()
|
||||
. = ..()
|
||||
if(direct_icon)
|
||||
applied_icon = icon(direct_icon, direct_icon_state, dir = SOUTH, frame = 1)
|
||||
else
|
||||
applied_icon = get_dynamic_human_icon(outfit, species, mob_spawner, l_hand, r_hand, generated_dirs = list(SOUTH), animated = FALSE)
|
||||
|
||||
/// This proc returns the name that the cardboard cutout item will use.
|
||||
/datum/cardboard_cutout/proc/get_name()
|
||||
return applied_name
|
||||
|
||||
/// This proc sets the cardboard cutout item's vars.
|
||||
/datum/cardboard_cutout/proc/apply(obj/item/cardboard_cutout/cutouts)
|
||||
cutouts.icon = applied_icon
|
||||
cutouts.name = get_name()
|
||||
cutouts.desc = applied_desc
|
||||
|
||||
/datum/cardboard_cutout/assistant
|
||||
name = "Assistant"
|
||||
applied_name = "John Greytide"
|
||||
applied_desc = "A cardboard cutout of an assistant."
|
||||
mob_spawner = /obj/effect/mob_spawn/corpse/human/generic_assistant
|
||||
|
||||
/datum/cardboard_cutout/assistant/get_name()
|
||||
return "[pick(GLOB.first_names_male)] [pick(GLOB.last_names)]"
|
||||
|
||||
/datum/cardboard_cutout/clown
|
||||
name = "Clown"
|
||||
applied_name = "HONK"
|
||||
applied_desc = "A cardboard cutout of a clown. You get the feeling that it should be in a corner."
|
||||
outfit = /datum/outfit/job/clown
|
||||
|
||||
/datum/cardboard_cutout/clown/get_name()
|
||||
return pick(GLOB.clown_names)
|
||||
|
||||
/datum/cardboard_cutout/mime
|
||||
name = "Mime"
|
||||
applied_name = "..."
|
||||
applied_desc = "...(A cardboard cutout of a mime.)"
|
||||
outfit = /datum/outfit/job/mime
|
||||
|
||||
/datum/cardboard_cutout/mime/get_name()
|
||||
return pick(GLOB.mime_names)
|
||||
|
||||
/datum/cardboard_cutout/traitor
|
||||
name = "Traitor"
|
||||
applied_name = "Unknown"
|
||||
applied_desc = "A cardboard cutout of a traitor."
|
||||
outfit = /datum/outfit/traitor_cutout
|
||||
|
||||
/datum/cardboard_cutout/traitor/get_name()
|
||||
return pick("Unknown", "Captain")
|
||||
|
||||
/datum/cardboard_cutout/nuclear_operative
|
||||
name = "Nuclear Operative"
|
||||
applied_name = "Unknown"
|
||||
applied_desc = "A cardboard cutout of a nuclear operative."
|
||||
outfit = /datum/outfit/syndicate/full
|
||||
|
||||
/datum/cardboard_cutout/nuclear_operative/get_name()
|
||||
return pick("Unknown", "COMMS", "Telecomms", "AI", "stealthy op", "STEALTH", "sneakybeaky", "MEDIC", "Medic")
|
||||
|
||||
/datum/cardboard_cutout/cultist
|
||||
name = "Cultist"
|
||||
applied_name = "Unknown"
|
||||
applied_desc = "A cardboard cutout of a cultist."
|
||||
outfit = /datum/outfit/cult_cutout
|
||||
|
||||
/datum/cardboard_cutout/revolutionary
|
||||
name = "Revolutionary"
|
||||
applied_name = "Unknown"
|
||||
applied_desc = "A cardboard cutout of a revolutionary."
|
||||
outfit = /datum/outfit/rev_cutout
|
||||
|
||||
/datum/cardboard_cutout/wizard
|
||||
name = "Wizard"
|
||||
applied_name = "wizard"
|
||||
applied_desc = "A cardboard cutout of a wizard."
|
||||
outfit = /datum/outfit/wizard/bookless
|
||||
|
||||
/datum/cardboard_cutout/wizard/get_name()
|
||||
return "[pick(GLOB.wizard_first)] [pick(GLOB.wizard_second)]"
|
||||
|
||||
/datum/cardboard_cutout/nightmare
|
||||
name = "Nightmare"
|
||||
applied_name = "nightmare"
|
||||
applied_desc = "A cardboard cutout of a nightmare."
|
||||
species = /datum/species/shadow/nightmare
|
||||
|
||||
/datum/cardboard_cutout/nightmare/get_name()
|
||||
return pick(GLOB.nightmare_names)
|
||||
|
||||
/datum/cardboard_cutout/xenomorph
|
||||
name = "Xenomorph"
|
||||
applied_name = "alien hunter"
|
||||
applied_desc = "A cardboard cutout of a xenomorph."
|
||||
direct_icon = 'icons/mob/nonhuman-player/alien.dmi'
|
||||
direct_icon_state = "alienh"
|
||||
|
||||
/datum/cardboard_cutout/xenomorph/get_name()
|
||||
return applied_name + " ([rand(1, 999)])"
|
||||
|
||||
/datum/cardboard_cutout/xenomorph_maid
|
||||
name = "Xenomorph Maid"
|
||||
applied_name = "lusty xenomorph maid"
|
||||
applied_desc = "A cardboard cutout of a xenomorph maid."
|
||||
direct_icon = 'icons/mob/nonhuman-player/alien.dmi'
|
||||
direct_icon_state = "maid"
|
||||
|
||||
/datum/cardboard_cutout/xenomorph_maid/get_name()
|
||||
return applied_name + " ([rand(1, 999)])"
|
||||
|
||||
/datum/cardboard_cutout/ash_walker
|
||||
name = "Ash Walker"
|
||||
applied_name = "lizard"
|
||||
applied_desc = "A cardboard cutout of an ash walker."
|
||||
species = /datum/species/lizard/ashwalker
|
||||
outfit = /datum/outfit/ashwalker/spear
|
||||
|
||||
/datum/cardboard_cutout/ash_walker/get_name()
|
||||
return lizard_name(pick(MALE, FEMALE))
|
||||
|
||||
/datum/cardboard_cutout/death_squad
|
||||
name = "Deathsquad Officer"
|
||||
applied_name = "deathsquad officer"
|
||||
applied_desc = "A cardboard cutout of a death commando."
|
||||
outfit = /datum/outfit/centcom/death_commando
|
||||
|
||||
/datum/cardboard_cutout/death_squad/get_name()
|
||||
return pick(GLOB.commando_names)
|
||||
|
||||
/datum/cardboard_cutout/ian
|
||||
name = "Ian"
|
||||
applied_name = "Ian"
|
||||
applied_desc = "A cardboard cutout of the HoP's beloved corgi."
|
||||
direct_icon = 'icons/mob/simple/pets.dmi'
|
||||
direct_icon_state = "corgi"
|
||||
|
||||
/datum/cardboard_cutout/slaughter_demon
|
||||
name = "Slaughter Demon"
|
||||
applied_name = "slaughter demon"
|
||||
applied_desc = "A cardboard cutout of a slaughter demon."
|
||||
direct_icon = 'icons/mob/simple/mob.dmi'
|
||||
direct_icon_state = "daemon"
|
||||
|
||||
/datum/cardboard_cutout/laughter_demon
|
||||
name = "Laughter Demon"
|
||||
applied_name = "laughter demon"
|
||||
applied_desc = "A cardboard cutout of a laughter demon."
|
||||
direct_icon = 'icons/mob/simple/mob.dmi'
|
||||
direct_icon_state = "bowmon"
|
||||
|
||||
/datum/cardboard_cutout/security_officer
|
||||
name = "Private Security Officer"
|
||||
applied_name = "Private Security Officer"
|
||||
applied_desc = "A cardboard cutout of a private security officer."
|
||||
mob_spawner = /obj/effect/mob_spawn/corpse/human/nanotrasensoldier
|
||||
|
||||
@@ -63,6 +63,12 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \
|
||||
new /datum/stack_recipe("Black Queen", /obj/structure/chess/blackqueen, 2, time = 1 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_ENTERTAINMENT), \
|
||||
new /datum/stack_recipe("Black King", /obj/structure/chess/blackking, 2, time = 1 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_ENTERTAINMENT), \
|
||||
)),
|
||||
new /datum/stack_recipe_list("checkers pieces", list( \
|
||||
new /datum/stack_recipe("White Checker Man", /obj/structure/chess/checker/whiteman, 2, time = 1 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_ENTERTAINMENT), \
|
||||
new /datum/stack_recipe("White Checker King", /obj/structure/chess/checker/whiteking, 2, time = 1 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_ENTERTAINMENT), \
|
||||
new /datum/stack_recipe("Black Checker Man", /obj/structure/chess/checker/blackman, 2, time = 1 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_ENTERTAINMENT), \
|
||||
new /datum/stack_recipe("Black Checker King", /obj/structure/chess/checker/blackking, 2, time = 1 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_ENTERTAINMENT), \
|
||||
)),
|
||||
null, \
|
||||
new/datum/stack_recipe("rack parts", /obj/item/rack_parts, category = CAT_FURNITURE), \
|
||||
new/datum/stack_recipe("closet", /obj/structure/closet, 2, time = 1.5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
icon = 'icons/obj/chess.dmi'
|
||||
icon_state = "white_pawn"
|
||||
name = "\improper Probably a White Pawn"
|
||||
desc = "This is weird. Please inform adminstration on how you managed to get the parent chess piece. Thanks!"
|
||||
desc = "This is weird. Please inform administration on how you managed to get the parent chess piece. Thanks!"
|
||||
max_integrity = 100
|
||||
|
||||
/obj/structure/chess/wrench_act(mob/user, obj/item/tool)
|
||||
@@ -80,3 +80,28 @@
|
||||
name = "\improper Black King"
|
||||
desc = "A black king chess piece. It can move one tile in any direction."
|
||||
icon_state = "black_king"
|
||||
|
||||
/obj/structure/chess/checker
|
||||
icon_state = "white_checker_man"
|
||||
name = "\improper Probably a White Checker"
|
||||
desc = "This is weird. Please inform administration on how you managed to get the parent checker piece. Thanks!"
|
||||
|
||||
/obj/structure/chess/checker/whiteman
|
||||
name = "\improper White Checker Man"
|
||||
desc = "A white checker piece. Looks suspiciously like a flattened chess pawn."
|
||||
icon_state = "white_checker_man"
|
||||
|
||||
/obj/structure/chess/checker/whiteking
|
||||
name = "\improper White Checker Man"
|
||||
desc = "A white checker piece. It's stacked!"
|
||||
icon_state = "white_checker_king"
|
||||
|
||||
/obj/structure/chess/checker/blackman
|
||||
name = "\improper Black Checker Man"
|
||||
desc = "A black checker piece. Looks suspiciously like a flattened chess pawn."
|
||||
icon_state = "black_checker_man"
|
||||
|
||||
/obj/structure/chess/checker/blackking
|
||||
name = "\improper Black Checker King"
|
||||
desc = "A black checker piece. It's stacked!"
|
||||
icon_state = "black_checker_king"
|
||||
|
||||
@@ -571,7 +571,3 @@
|
||||
equipped.eye_color_left = BLOODCULT_EYE
|
||||
equipped.eye_color_right = BLOODCULT_EYE
|
||||
equipped.update_body()
|
||||
|
||||
var/obj/item/clothing/suit/hooded/hooded = locate() in equipped
|
||||
hooded.MakeHood() // This is usually created on Initialize, but we run before atoms
|
||||
hooded.ToggleHood()
|
||||
|
||||
@@ -765,8 +765,3 @@
|
||||
|
||||
suit = /obj/item/clothing/suit/hooded/cultrobes/eldritch
|
||||
r_hand = /obj/item/melee/touch_attack/mansus_fist
|
||||
|
||||
/datum/outfit/heretic/post_equip(mob/living/carbon/human/equipper, visualsOnly)
|
||||
var/obj/item/clothing/suit/hooded/hooded = locate() in equipper
|
||||
hooded.MakeHood() // This is usually created on Initialize, but we run before atoms
|
||||
hooded.ToggleHood()
|
||||
|
||||
@@ -103,6 +103,29 @@
|
||||
head = /obj/item/clothing/head/helmet/redtaghelm
|
||||
shoes = /obj/item/clothing/shoes/sneakers/red
|
||||
|
||||
/datum/outfit/traitor_cutout
|
||||
name = "Traitor Cutout"
|
||||
|
||||
uniform = /obj/item/clothing/under/color/grey
|
||||
suit = /obj/item/clothing/suit/armor/vest
|
||||
gloves = /obj/item/clothing/gloves/chief_engineer
|
||||
mask = /obj/item/clothing/mask/gas
|
||||
belt = /obj/item/storage/belt
|
||||
l_hand = /obj/item/melee/energy/sword/saber/red
|
||||
r_hand = /obj/item/gun/energy/recharge/ebow
|
||||
shoes = /obj/item/clothing/shoes/magboots/advance
|
||||
|
||||
/datum/outfit/rev_cutout
|
||||
name = "Revolutionary Cutout"
|
||||
|
||||
uniform = /obj/item/clothing/under/color/grey
|
||||
back = /obj/item/storage/backpack
|
||||
gloves = /obj/item/clothing/gloves/color/yellow
|
||||
mask = /obj/item/clothing/mask/gas
|
||||
belt = /obj/item/storage/belt
|
||||
l_hand = /obj/item/melee/baton/security/cattleprod
|
||||
shoes = /obj/item/clothing/shoes/sneakers/black
|
||||
|
||||
/datum/outfit/laser_tag/blue
|
||||
name = "Laser Tag Blue"
|
||||
|
||||
@@ -248,6 +271,15 @@
|
||||
shoes = /obj/item/clothing/shoes/cult/alt/ghost
|
||||
l_hand = /obj/item/melee/cultblade/ghost
|
||||
|
||||
/datum/outfit/cult_cutout
|
||||
name = "Cultist Cutout"
|
||||
|
||||
uniform = /obj/item/clothing/under/rank/civilian/chaplain
|
||||
suit = /obj/item/clothing/suit/hooded/cultrobes/hardened
|
||||
shoes = /obj/item/clothing/shoes/cult/alt
|
||||
back = /obj/item/storage/backpack/cultpack
|
||||
r_hand = /obj/item/melee/cultblade/dagger
|
||||
|
||||
/datum/outfit/wizard
|
||||
name = "Blue Wizard"
|
||||
|
||||
@@ -255,9 +287,9 @@
|
||||
suit = /obj/item/clothing/suit/wizrobe
|
||||
back = /obj/item/storage/backpack
|
||||
backpack_contents = list(
|
||||
/obj/item/storage/box/survival = 1,
|
||||
/obj/item/spellbook = 1,
|
||||
)
|
||||
)
|
||||
box = /obj/item/storage/box/survival
|
||||
ears = /obj/item/radio/headset
|
||||
head = /obj/item/clothing/head/wizard
|
||||
shoes = /obj/item/clothing/shoes/sandal/magic
|
||||
@@ -272,13 +304,20 @@
|
||||
if(new_spellbook)
|
||||
new_spellbook.owner = wizard.mind
|
||||
|
||||
/datum/outfit/wizard/bookless
|
||||
name = "Wizard - Bookless"
|
||||
backpack_contents = list()
|
||||
|
||||
/datum/outfit/wizard/bookless/post_equip(mob/living/carbon/human/wizard, visualsOnly)
|
||||
return
|
||||
|
||||
/datum/outfit/wizard/apprentice
|
||||
name = "Wizard Apprentice"
|
||||
|
||||
r_pocket = /obj/item/teleportation_scroll/apprentice
|
||||
r_hand = null
|
||||
l_hand = null
|
||||
backpack_contents = list(/obj/item/storage/box/survival = 1)
|
||||
backpack_contents = list()
|
||||
|
||||
/datum/outfit/wizard/red
|
||||
name = "Red Wizard"
|
||||
@@ -299,7 +338,7 @@
|
||||
r_hand = null
|
||||
suit = /obj/item/clothing/suit/wizrobe/red
|
||||
head = /obj/item/clothing/head/wizard/red
|
||||
backpack_contents = list(/obj/item/storage/box/survival = 1)
|
||||
backpack_contents = list()
|
||||
|
||||
/datum/outfit/centcom/soviet
|
||||
name = "Soviet Admiral"
|
||||
|
||||
@@ -36,6 +36,11 @@
|
||||
RemoveHood()
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/suit/hooded/on_outfit_equip(mob/living/carbon/human/outfit_wearer, visuals_only, item_slot)
|
||||
if(visuals_only)
|
||||
MakeHood()
|
||||
ToggleHood()
|
||||
|
||||
/obj/item/clothing/suit/hooded/proc/RemoveHood()
|
||||
src.icon_state = "[initial(icon_state)]"
|
||||
hood_up = FALSE
|
||||
|
||||
@@ -70,6 +70,10 @@
|
||||
flags_inv = HIDEHAIR|HIDEFACIALHAIR
|
||||
dog_fashion = null
|
||||
|
||||
/obj/item/clothing/head/wizard/hood
|
||||
name = "wizard hood"
|
||||
icon_state = "wizhood"
|
||||
|
||||
/obj/item/clothing/suit/wizrobe
|
||||
name = "wizard robe"
|
||||
desc = "A magnificent, gem-lined robe that seems to radiate power."
|
||||
|
||||
@@ -151,11 +151,11 @@
|
||||
body_floats = TRUE
|
||||
|
||||
/datum/hallucination/body/weird/faceless
|
||||
body_image_file = 'icons/mob/simple/simple_human.dmi'
|
||||
body_image_file = 'icons/mob/simple/traders.dmi'
|
||||
body_image_state = "faceless"
|
||||
|
||||
/datum/hallucination/body/weird/bones
|
||||
body_image_file = 'icons/mob/simple/simple_human.dmi'
|
||||
body_image_file = 'icons/mob/simple/traders.dmi'
|
||||
body_image_state = "mrbones"
|
||||
|
||||
/datum/hallucination/body/weird/freezer
|
||||
|
||||
@@ -18,6 +18,8 @@
|
||||
var/delusion_icon_file
|
||||
/// The icon state of the delusion image
|
||||
var/delusion_icon_state
|
||||
/// Do we use a generated icon? If yes no icon file or state needed.
|
||||
var/dynamic_icon = FALSE
|
||||
/// The name of the delusion image
|
||||
var/delusion_name
|
||||
|
||||
@@ -94,7 +96,7 @@
|
||||
return TRUE
|
||||
|
||||
/datum/hallucination/delusion/proc/make_delusion_image(mob/over_who)
|
||||
var/image/funny_image = image(delusion_icon_file, over_who, delusion_icon_state)
|
||||
var/image/funny_image = image(delusion_icon_file, over_who, dynamic_icon ? "" : delusion_icon_state)
|
||||
funny_image.name = delusion_name
|
||||
funny_image.override = TRUE
|
||||
return funny_image
|
||||
@@ -196,27 +198,24 @@
|
||||
|
||||
/datum/hallucination/delusion/preset/syndies
|
||||
random_hallucination_weight = 1
|
||||
delusion_icon_file = 'icons/mob/simple/simple_human.dmi'
|
||||
delusion_icon_state = "syndicate_space"
|
||||
dynamic_icon = TRUE
|
||||
delusion_name = "Syndicate"
|
||||
affects_others = TRUE
|
||||
affects_us = FALSE
|
||||
|
||||
/datum/hallucination/delusion/preset/syndies/make_delusion_image(mob/over_who)
|
||||
var/static/list/syndicate_icon_states
|
||||
|
||||
if(!syndicate_icon_states)
|
||||
syndicate_icon_states = list()
|
||||
for(var/state in icon_states(delusion_icon_file))
|
||||
if(!findtext(state, "syndicate"))
|
||||
continue
|
||||
|
||||
syndicate_icon_states += state
|
||||
|
||||
if(length(syndicate_icon_states) > 0)
|
||||
delusion_name = over_who.name
|
||||
delusion_icon_state = pick(syndicate_icon_states)
|
||||
else
|
||||
stack_trace("Hey! The hallucination [type] couldn't find a single icon state to use, it'll be invisible. Correct this.")
|
||||
|
||||
delusion_icon_file = get_dynamic_human_icon( \
|
||||
mob_spawn_path = pick( \
|
||||
/obj/effect/mob_spawn/corpse/human/syndicatesoldier, \
|
||||
/obj/effect/mob_spawn/corpse/human/syndicatecommando, \
|
||||
/obj/effect/mob_spawn/corpse/human/syndicatestormtrooper, \
|
||||
), \
|
||||
r_hand = pick( \
|
||||
/obj/item/knife/combat/survival, \
|
||||
/obj/item/melee/energy/sword/saber, \
|
||||
/obj/item/gun/ballistic/automatic/pistol, \
|
||||
/obj/item/gun/ballistic/automatic/c20r, \
|
||||
/obj/item/gun/ballistic/shotgun/bulldog, \
|
||||
), \
|
||||
)
|
||||
return ..()
|
||||
|
||||
@@ -72,14 +72,6 @@
|
||||
mask = /obj/item/clothing/mask/gas/explorer
|
||||
internals_slot = ITEM_SLOT_SUITSTORE
|
||||
|
||||
/datum/outfit/job/miner/equipped/post_equip(mob/living/carbon/human/miner, visualsOnly = FALSE)
|
||||
..()
|
||||
if(visualsOnly)
|
||||
return
|
||||
if(istype(miner.wear_suit, /obj/item/clothing/suit/hooded))
|
||||
var/obj/item/clothing/suit/hooded/explorer_suit = miner.wear_suit
|
||||
explorer_suit.ToggleHood()
|
||||
|
||||
/datum/outfit/job/miner/equipped/mod
|
||||
name = "Shaft Miner (Equipment + MODsuit)"
|
||||
back = /obj/item/mod/control/pre_equipped/mining
|
||||
|
||||
@@ -130,25 +130,21 @@ GLOBAL_VAR_INIT(fscpassword, generate_password())
|
||||
/mob/living/simple_animal/hostile/nanotrasen/ranged/assault
|
||||
name = "Nanotrasen Assault Officer"
|
||||
desc = "Nanotrasen Assault Officer. Contact CentCom if you saw him on your station. Prepare to die, if you've been found near Syndicate property."
|
||||
icon_state = "nanotrasenrangedassault"
|
||||
icon_living = "nanotrasenrangedassault"
|
||||
icon_dead = null
|
||||
icon_gib = "syndicate_gib"
|
||||
ranged = TRUE
|
||||
rapid = 4
|
||||
rapid_fire_delay = 1
|
||||
rapid_melee = 1
|
||||
retreat_distance = 2
|
||||
minimum_distance = 4
|
||||
casingtype = /obj/item/ammo_casing/c46x30mm
|
||||
projectilesound = 'sound/weapons/gun/general/heavy_shot_suppressed.ogg'
|
||||
casingtype = /obj/item/ammo_casing/a556/weak
|
||||
projectilesound = 'sound/weapons/gun/smg/shot.ogg'
|
||||
loot = list(/obj/effect/mob_spawn/corpse/human/nanotrasenassaultsoldier)
|
||||
mob_spawner = /obj/effect/mob_spawn/corpse/human/nanotrasenassaultsoldier
|
||||
held_item = /obj/item/gun/ballistic/automatic/ar
|
||||
|
||||
/mob/living/simple_animal/hostile/nanotrasen/elite
|
||||
name = "Nanotrasen Elite Assault Officer"
|
||||
desc = "Pray for your life, syndicate. Run while you can."
|
||||
icon_state = "nanotrasen_ert"
|
||||
icon_living = "nanotrasen_ert"
|
||||
maxHealth = 150
|
||||
health = 150
|
||||
melee_damage_lower = 13
|
||||
@@ -165,3 +161,5 @@ GLOBAL_VAR_INIT(fscpassword, generate_password())
|
||||
projectilesound = 'sound/weapons/laser.ogg'
|
||||
loot = list(/obj/effect/gibspawner/human)
|
||||
faction = list(ROLE_DEATHSQUAD)
|
||||
mob_spawner = /obj/effect/mob_spawn/corpse/human/nanotrasenelitesoldier
|
||||
held_item = /obj/item/gun/energy/pulse/carbine/lethal
|
||||
|
||||
@@ -366,6 +366,47 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava)
|
||||
. = ..()
|
||||
. += " | trait name: [trait_name]"
|
||||
|
||||
///This helper applies dynamic human icons to things on the map
|
||||
/obj/effect/mapping_helpers/atom_injector/human_icon_injector
|
||||
name = "Human Icon Injector"
|
||||
icon_state = "icon"
|
||||
/// Path of the outfit we give the human.
|
||||
var/outfit_path
|
||||
/// Path of the species we give the human.
|
||||
var/species_path = /datum/species/human
|
||||
/// Path of the mob spawner we base the human off of.
|
||||
var/mob_spawn_path
|
||||
/// Path of the right hand item we give the human.
|
||||
var/r_hand = NO_REPLACE
|
||||
/// Path of the left hand item we give the human.
|
||||
var/l_hand = NO_REPLACE
|
||||
/// Which slots on the mob should be bloody?
|
||||
var/bloody_slots = NONE
|
||||
/// Directions we generate for the mob.
|
||||
var/generated_dirs = list(NORTH, SOUTH, EAST, WEST)
|
||||
/// Do we draw more than one frame for the mob?
|
||||
var/animated = TRUE
|
||||
|
||||
/obj/effect/mapping_helpers/atom_injector/human_icon_injector/check_validity()
|
||||
if(!ispath(species_path, /datum/species))
|
||||
CRASH("Wrong species path in [type] - [species_path] is not a species")
|
||||
if(outfit_path && !ispath(outfit_path, /datum/outfit))
|
||||
CRASH("Wrong outfit path in [type] - [species_path] is not an outfit")
|
||||
if(mob_spawn_path && !ispath(mob_spawn_path, /obj/effect/mob_spawn))
|
||||
CRASH("Wrong mob spawn path in [type] - [mob_spawn_path] is not a mob spawner")
|
||||
if(l_hand && !ispath(l_hand, /obj/item))
|
||||
CRASH("Wrong left hand item path in [type] - [l_hand] is not an item")
|
||||
if(r_hand && !ispath(r_hand, /obj/item))
|
||||
CRASH("Wrong left hand item path in [type] - [r_hand] is not an item")
|
||||
return TRUE
|
||||
|
||||
/obj/effect/mapping_helpers/atom_injector/human_icon_injector/inject(atom/target)
|
||||
apply_dynamic_human_icon(target, outfit_path, species_path, mob_spawn_path, r_hand, l_hand, bloody_slots, generated_dirs, animated)
|
||||
|
||||
/obj/effect/mapping_helpers/atom_injector/human_icon_injector/generate_stack_trace()
|
||||
. = ..()
|
||||
. += " | outfit path: [outfit_path] | species path: [species_path] | mob spawner path: [mob_spawn_path] | right/left hand path: [r_hand]/[l_hand]"
|
||||
|
||||
///Fetches an external dmi and applies to the target object
|
||||
/obj/effect/mapping_helpers/atom_injector/custom_icon
|
||||
name = "Custom Icon Injector"
|
||||
|
||||
@@ -1,18 +1,9 @@
|
||||
///////////////Base Mob////////////
|
||||
|
||||
/obj/effect/light_emitter/red_energy_sword //used so there's a combination of both their head light and light coming off the energy sword
|
||||
set_luminosity = 2
|
||||
set_cap = 2.5
|
||||
light_color = COLOR_SOFT_RED
|
||||
|
||||
/mob/living/basic/syndicate
|
||||
name = "Syndicate Operative"
|
||||
desc = "Death to Nanotrasen."
|
||||
icon = 'icons/mob/simple/simple_human.dmi'
|
||||
icon_state = "syndicate"
|
||||
icon_living = "syndicate"
|
||||
icon_dead = "syndicate_dead"
|
||||
icon_gib = "syndicate_gib"
|
||||
mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
|
||||
sentience_type = SENTIENCE_HUMANOID
|
||||
maxHealth = 100
|
||||
@@ -31,24 +22,30 @@
|
||||
unsuitable_heat_damage = 7.5
|
||||
faction = list(ROLE_SYNDICATE)
|
||||
ai_controller = /datum/ai_controller/basic_controller/syndicate
|
||||
|
||||
/// Loot this mob drops on death.
|
||||
var/loot = list(/obj/effect/mob_spawn/corpse/human/syndicatesoldier)
|
||||
/// Path of the mob spawner we base the mob's visuals off of.
|
||||
var/mob_spawner = /obj/effect/mob_spawn/corpse/human/syndicatesoldier
|
||||
/// Path of the right hand held item we give to the mob's visuals.
|
||||
var/r_hand
|
||||
/// Path of the left hand held item we give to the mob's visuals.
|
||||
var/l_hand
|
||||
|
||||
/mob/living/basic/syndicate/Initialize(mapload)
|
||||
. = ..()
|
||||
apply_dynamic_human_icon(src, mob_spawn_path = mob_spawner, r_hand = r_hand, l_hand = l_hand)
|
||||
if(LAZYLEN(loot))
|
||||
AddElement(/datum/element/death_drops, loot)
|
||||
AddElement(/datum/element/footstep, footstep_type = FOOTSTEP_MOB_SHOE)
|
||||
|
||||
/mob/living/basic/syndicate/space
|
||||
icon_state = "syndicate_space"
|
||||
icon_living = "syndicate_space"
|
||||
name = "Syndicate Commando"
|
||||
maxHealth = 170
|
||||
health = 170
|
||||
loot = list(/obj/effect/gibspawner/human)
|
||||
unsuitable_atmos_damage = 0
|
||||
minimum_survivable_temperature = 0
|
||||
mob_spawner = /obj/effect/mob_spawn/corpse/human/syndicatecommando
|
||||
|
||||
/mob/living/basic/syndicate/space/Initialize(mapload)
|
||||
. = ..()
|
||||
@@ -56,22 +53,20 @@
|
||||
set_light(4)
|
||||
|
||||
/mob/living/basic/syndicate/space/stormtrooper
|
||||
icon_state = "syndicate_stormtrooper"
|
||||
icon_living = "syndicate_stormtrooper"
|
||||
name = "Syndicate Stormtrooper"
|
||||
maxHealth = 250
|
||||
health = 250
|
||||
mob_spawner = /obj/effect/mob_spawn/corpse/human/syndicatestormtrooper
|
||||
|
||||
/mob/living/basic/syndicate/melee //dude with a knife and no shields
|
||||
melee_damage_lower = 15
|
||||
melee_damage_upper = 15
|
||||
icon_state = "syndicate_knife"
|
||||
icon_living = "syndicate_knife"
|
||||
loot = list(/obj/effect/gibspawner/human)
|
||||
attack_verb_continuous = "slashes"
|
||||
attack_verb_simple = "slash"
|
||||
attack_sound = 'sound/weapons/bladeslice.ogg'
|
||||
attack_vis_effect = ATTACK_EFFECT_SLASH
|
||||
r_hand = /obj/item/knife/combat/survival
|
||||
var/projectile_deflect_chance = 0
|
||||
|
||||
/mob/living/basic/syndicate/melee/bullet_act(obj/projectile/projectile)
|
||||
@@ -81,13 +76,12 @@
|
||||
return ..()
|
||||
|
||||
/mob/living/basic/syndicate/melee/space
|
||||
icon_state = "syndicate_space_knife"
|
||||
icon_living = "syndicate_space_knife"
|
||||
name = "Syndicate Commando"
|
||||
maxHealth = 170
|
||||
health = 170
|
||||
unsuitable_atmos_damage = 0
|
||||
minimum_survivable_temperature = 0
|
||||
mob_spawner = /obj/effect/mob_spawn/corpse/human/syndicatecommando
|
||||
|
||||
/mob/living/basic/syndicate/melee/space/Initialize(mapload)
|
||||
. = ..()
|
||||
@@ -95,65 +89,53 @@
|
||||
set_light(4)
|
||||
|
||||
/mob/living/basic/syndicate/melee/space/stormtrooper
|
||||
icon_state = "syndicate_stormtrooper_knife"
|
||||
icon_living = "syndicate_stormtrooper_knife"
|
||||
name = "Syndicate Stormtrooper"
|
||||
maxHealth = 250
|
||||
health = 250
|
||||
mob_spawner = /obj/effect/mob_spawn/corpse/human/syndicatestormtrooper
|
||||
|
||||
/mob/living/basic/syndicate/melee/sword
|
||||
melee_damage_lower = 30
|
||||
melee_damage_upper = 30
|
||||
icon_state = "syndicate_sword"
|
||||
icon_living = "syndicate_sword"
|
||||
attack_verb_continuous = "slashes"
|
||||
attack_verb_simple = "slash"
|
||||
attack_sound = 'sound/weapons/blade1.ogg'
|
||||
armour_penetration = 35
|
||||
light_color = COLOR_SOFT_RED
|
||||
projectile_deflect_chance = 50
|
||||
|
||||
/mob/living/basic/syndicate/melee/sword/Initialize(mapload)
|
||||
. = ..()
|
||||
set_light(2)
|
||||
light_range = 2
|
||||
light_power = 2.5
|
||||
light_color = COLOR_SOFT_RED
|
||||
r_hand = /obj/item/melee/energy/sword/saber/red
|
||||
l_hand = /obj/item/shield/energy
|
||||
|
||||
/mob/living/basic/syndicate/melee/sword/space
|
||||
icon_state = "syndicate_space_sword"
|
||||
icon_living = "syndicate_space_sword"
|
||||
name = "Syndicate Commando"
|
||||
maxHealth = 170
|
||||
health = 170
|
||||
unsuitable_atmos_damage = 0
|
||||
minimum_survivable_temperature = 0
|
||||
projectile_deflect_chance = 50
|
||||
var/obj/effect/light_emitter/red_energy_sword/sord
|
||||
mob_spawner = /obj/effect/mob_spawn/corpse/human/syndicatecommando
|
||||
|
||||
/mob/living/basic/syndicate/melee/sword/space/Initialize(mapload)
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT)
|
||||
sord = new(src)
|
||||
set_light(4)
|
||||
/mob/living/basic/syndicate/melee/sword/space/Destroy()
|
||||
QDEL_NULL(sord)
|
||||
return ..()
|
||||
|
||||
/mob/living/basic/syndicate/melee/sword/space/stormtrooper
|
||||
icon_state = "syndicate_stormtrooper_sword"
|
||||
icon_living = "syndicate_stormtrooper_sword"
|
||||
name = "Syndicate Stormtrooper"
|
||||
maxHealth = 250
|
||||
health = 250
|
||||
projectile_deflect_chance = 50
|
||||
mob_spawner = /obj/effect/mob_spawn/corpse/human/syndicatestormtrooper
|
||||
|
||||
///////////////Guns////////////
|
||||
|
||||
/mob/living/basic/syndicate/ranged
|
||||
icon_state = "syndicate_pistol"
|
||||
icon_living = "syndicate_pistol"
|
||||
var/casingtype = /obj/item/ammo_casing/c9mm
|
||||
var/projectilesound = 'sound/weapons/gun/pistol/shot.ogg'
|
||||
loot = list(/obj/effect/gibspawner/human)
|
||||
ai_controller = /datum/ai_controller/basic_controller/syndicate/ranged
|
||||
r_hand = /obj/item/gun/ballistic/automatic/pistol
|
||||
var/casingtype = /obj/item/ammo_casing/c9mm
|
||||
var/projectilesound = 'sound/weapons/gun/pistol/shot.ogg'
|
||||
|
||||
/mob/living/basic/syndicate/ranged/Initialize(mapload)
|
||||
. = ..()
|
||||
@@ -164,13 +146,12 @@
|
||||
loot = list(/obj/effect/mob_spawn/corpse/human/syndicatesoldier)
|
||||
|
||||
/mob/living/basic/syndicate/ranged/space
|
||||
icon_state = "syndicate_space_pistol"
|
||||
icon_living = "syndicate_space_pistol"
|
||||
name = "Syndicate Commando"
|
||||
maxHealth = 170
|
||||
health = 170
|
||||
unsuitable_atmos_damage = 0
|
||||
minimum_survivable_temperature = 0
|
||||
mob_spawner = /obj/effect/mob_spawn/corpse/human/syndicatecommando
|
||||
|
||||
/mob/living/basic/syndicate/ranged/space/Initialize(mapload)
|
||||
. = ..()
|
||||
@@ -178,31 +159,29 @@
|
||||
set_light(4)
|
||||
|
||||
/mob/living/basic/syndicate/ranged/space/stormtrooper
|
||||
icon_state = "syndicate_stormtrooper_pistol"
|
||||
icon_living = "syndicate_stormtrooper_pistol"
|
||||
name = "Syndicate Stormtrooper"
|
||||
maxHealth = 250
|
||||
health = 250
|
||||
mob_spawner = /obj/effect/mob_spawn/corpse/human/syndicatestormtrooper
|
||||
|
||||
/mob/living/basic/syndicate/ranged/smg
|
||||
icon_state = "syndicate_smg"
|
||||
icon_living = "syndicate_smg"
|
||||
casingtype = /obj/item/ammo_casing/c45
|
||||
projectilesound = 'sound/weapons/gun/smg/shot.ogg'
|
||||
ai_controller = /datum/ai_controller/basic_controller/syndicate/ranged/burst
|
||||
r_hand = /obj/item/gun/ballistic/automatic/c20r
|
||||
|
||||
/mob/living/basic/syndicate/ranged/smg/pilot //caravan ambush ruin
|
||||
name = "Syndicate Salvage Pilot"
|
||||
loot = list(/obj/effect/mob_spawn/corpse/human/syndicatesoldier)
|
||||
loot = list(/obj/effect/mob_spawn/corpse/human/syndicatepilot)
|
||||
mob_spawner = /obj/effect/mob_spawn/corpse/human/syndicatepilot
|
||||
|
||||
/mob/living/basic/syndicate/ranged/smg/space
|
||||
icon_state = "syndicate_space_smg"
|
||||
icon_living = "syndicate_space_smg"
|
||||
name = "Syndicate Commando"
|
||||
maxHealth = 170
|
||||
health = 170
|
||||
unsuitable_atmos_damage = 0
|
||||
minimum_survivable_temperature = 0
|
||||
mob_spawner = /obj/effect/mob_spawn/corpse/human/syndicatecommando
|
||||
|
||||
/mob/living/basic/syndicate/ranged/smg/space/Initialize(mapload)
|
||||
. = ..()
|
||||
@@ -210,27 +189,24 @@
|
||||
set_light(4)
|
||||
|
||||
/mob/living/basic/syndicate/ranged/smg/space/stormtrooper
|
||||
icon_state = "syndicate_stormtrooper_smg"
|
||||
icon_living = "syndicate_stormtrooper_smg"
|
||||
name = "Syndicate Stormtrooper"
|
||||
maxHealth = 250
|
||||
health = 250
|
||||
mob_spawner = /obj/effect/mob_spawn/corpse/human/syndicatestormtrooper
|
||||
|
||||
/mob/living/basic/syndicate/ranged/shotgun
|
||||
icon_state = "syndicate_shotgun"
|
||||
icon_living = "syndicate_shotgun"
|
||||
casingtype = /obj/item/ammo_casing/shotgun/buckshot //buckshot (up to 72.5 brute) fired in a two-round burst
|
||||
ai_controller = /datum/ai_controller/basic_controller/syndicate/ranged/shotgunner
|
||||
r_hand = /obj/item/gun/ballistic/shotgun/bulldog
|
||||
|
||||
/mob/living/basic/syndicate/ranged/shotgun/space
|
||||
icon_state = "syndicate_space_shotgun"
|
||||
icon_living = "syndicate_space_shotgun"
|
||||
name = "Syndicate Commando"
|
||||
maxHealth = 170
|
||||
health = 170
|
||||
unsuitable_atmos_damage = 0
|
||||
minimum_survivable_temperature = 0
|
||||
speed = 1
|
||||
mob_spawner = /obj/effect/mob_spawn/corpse/human/syndicatecommando
|
||||
|
||||
/mob/living/basic/syndicate/ranged/shotgun/space/Initialize(mapload)
|
||||
. = ..()
|
||||
@@ -238,19 +214,16 @@
|
||||
set_light(4)
|
||||
|
||||
/mob/living/basic/syndicate/ranged/shotgun/space/stormtrooper
|
||||
icon_state = "syndicate_stormtrooper_shotgun"
|
||||
icon_living = "syndicate_stormtrooper_shotgun"
|
||||
name = "Syndicate Stormtrooper"
|
||||
maxHealth = 250
|
||||
health = 250
|
||||
mob_spawner = /obj/effect/mob_spawn/corpse/human/syndicatestormtrooper
|
||||
|
||||
///////////////Misc////////////
|
||||
|
||||
/mob/living/basic/viscerator
|
||||
name = "viscerator"
|
||||
desc = "A small, twin-bladed machine capable of inflicting very deadly lacerations."
|
||||
icon_state = "viscerator_attack"
|
||||
icon_living = "viscerator_attack"
|
||||
pass_flags = PASSTABLE | PASSMOB
|
||||
combat_mode = TRUE
|
||||
mob_biotypes = MOB_ROBOTIC
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
/mob/living/simple_animal/hostile/retaliate/trader
|
||||
name = "Trader"
|
||||
desc = "Come buy some!"
|
||||
icon = 'icons/mob/simple/simple_human.dmi'
|
||||
icon = 'icons/mob/simple/traders.dmi'
|
||||
icon_state = "faceless"
|
||||
maxHealth = 200
|
||||
health = 200
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
del_on_death = TRUE
|
||||
icon = 'icons/mob/simple/simple_human.dmi'
|
||||
icon_state = "paperwizard"
|
||||
ranged = 1
|
||||
ranged = TRUE
|
||||
environment_smash = ENVIRONMENT_SMASH_NONE
|
||||
minimum_distance = 3
|
||||
retreat_distance = 3
|
||||
@@ -21,9 +21,12 @@
|
||||
projectiletype = /obj/projectile/temp
|
||||
projectilesound = 'sound/weapons/emitter.ogg'
|
||||
attack_sound = 'sound/hallucinations/growl1.ogg'
|
||||
footstep_type = FOOTSTEP_MOB_SHOE
|
||||
var/list/copies = list()
|
||||
|
||||
footstep_type = FOOTSTEP_MOB_SHOE
|
||||
/mob/living/simple_animal/hostile/boss/paper_wizard/Initialize(mapload)
|
||||
. = ..()
|
||||
apply_dynamic_human_icon(src, mob_spawn_path = /obj/effect/mob_spawn/corpse/human/wizard/paper)
|
||||
|
||||
/mob/living/simple_animal/hostile/boss/paper_wizard/Destroy()
|
||||
QDEL_LIST(copies)
|
||||
|
||||
@@ -28,7 +28,11 @@
|
||||
faction = list("hostile")
|
||||
check_friendly_fire = 1
|
||||
status_flags = CANPUSH
|
||||
del_on_death = 1
|
||||
del_on_death = TRUE
|
||||
|
||||
/mob/living/simple_animal/hostile/cat_butcherer/Initialize(mapload)
|
||||
. = ..()
|
||||
apply_dynamic_human_icon(src, mob_spawn_path = /obj/effect/mob_spawn/corpse/human/cat_butcher, l_hand = /obj/item/circular_saw, bloody_slots = ITEM_SLOT_GLOVES|ITEM_SLOT_OCLOTHING)
|
||||
|
||||
/mob/living/simple_animal/hostile/cat_butcherer/AttackingTarget()
|
||||
. = ..()
|
||||
|
||||
@@ -33,6 +33,10 @@
|
||||
loot = list(/obj/effect/decal/remains/human)
|
||||
del_on_death = TRUE
|
||||
|
||||
/mob/living/simple_animal/hostile/dark_wizard/Initialize(mapload)
|
||||
. = ..()
|
||||
apply_dynamic_human_icon(src, mob_spawn_path = /obj/effect/mob_spawn/corpse/human/wizard/dark, r_hand = /obj/item/staff)
|
||||
|
||||
/obj/projectile/temp/earth_bolt
|
||||
name = "earth bolt"
|
||||
icon_state = "declone"
|
||||
|
||||
@@ -2,10 +2,6 @@
|
||||
name = "\improper Nanotrasen Private Security Officer"
|
||||
desc = "An officer part of Nanotrasen's private security force, he seems rather unpleased to meet you."
|
||||
icon = 'icons/mob/simple/simple_human.dmi'
|
||||
icon_state = "nanotrasen"
|
||||
icon_living = "nanotrasen"
|
||||
icon_dead = null
|
||||
icon_gib = "syndicate_gib"
|
||||
mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
|
||||
sentience_type = SENTIENCE_HUMANOID
|
||||
speak_chance = 0
|
||||
@@ -31,17 +27,20 @@
|
||||
del_on_death = TRUE
|
||||
dodging = TRUE
|
||||
footstep_type = FOOTSTEP_MOB_SHOE
|
||||
/// Path of the mob spawner we base the mob's visuals off of.
|
||||
var/mob_spawner = /obj/effect/mob_spawn/corpse/human/nanotrasensoldier
|
||||
/// Path of the held item we give to the mob's visuals.
|
||||
var/held_item
|
||||
|
||||
/mob/living/simple_animal/hostile/nanotrasen/screaming
|
||||
icon_state = "nanotrasen"
|
||||
icon_living = "nanotrasen"
|
||||
/mob/living/simple_animal/hostile/nanotrasen/Initialize(mapload)
|
||||
. = ..()
|
||||
apply_dynamic_human_icon(src, mob_spawn_path = mob_spawner, r_hand = held_item)
|
||||
|
||||
/mob/living/simple_animal/hostile/nanotrasen/screaming/Aggro()
|
||||
..()
|
||||
summon_backup(15)
|
||||
say("411 in progress, requesting backup!")
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/nanotrasen/ranged
|
||||
icon_state = "nanotrasenranged"
|
||||
icon_living = "nanotrasenranged"
|
||||
@@ -50,7 +49,7 @@
|
||||
minimum_distance = 5
|
||||
casingtype = /obj/item/ammo_casing/c45
|
||||
projectilesound = 'sound/weapons/gun/pistol/shot_alt.ogg'
|
||||
|
||||
held_item = /obj/item/gun/ballistic/automatic/pistol/m1911
|
||||
|
||||
/mob/living/simple_animal/hostile/nanotrasen/ranged/smg
|
||||
icon_state = "nanotrasenrangedsmg"
|
||||
@@ -58,3 +57,55 @@
|
||||
rapid = 3
|
||||
casingtype = /obj/item/ammo_casing/c46x30mm
|
||||
projectilesound = 'sound/weapons/gun/smg/shot.ogg'
|
||||
held_item = /obj/item/gun/ballistic/automatic/wt550
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/nanotrasenpeace
|
||||
name = "\improper Nanotrasen Private Security Officer"
|
||||
desc = "An officer part of Nanotrasen's private security force."
|
||||
icon = 'icons/mob/simple/simple_human.dmi'
|
||||
turns_per_move = 5
|
||||
speed = 0
|
||||
stat_attack = HARD_CRIT
|
||||
robust_searching = 1
|
||||
vision_range = 3
|
||||
maxHealth = 100
|
||||
health = 100
|
||||
harm_intent_damage = 5
|
||||
melee_damage_lower = 10
|
||||
melee_damage_upper = 15
|
||||
attack_verb_continuous = "punches"
|
||||
attack_verb_simple = "punch"
|
||||
attack_sound = 'sound/weapons/punch1.ogg'
|
||||
faction = list("nanotrasenprivate")
|
||||
mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
|
||||
sentience_type = SENTIENCE_HUMANOID
|
||||
combat_mode = TRUE
|
||||
loot = list(/obj/effect/mob_spawn/corpse/human/nanotrasensoldier)
|
||||
atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
|
||||
unsuitable_atmos_damage = 7.5
|
||||
status_flags = CANPUSH
|
||||
search_objects = 1
|
||||
/// Path of the held item we give to the mob's visuals.
|
||||
var/held_item
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/nanotrasenpeace/Initialize(mapload)
|
||||
. = ..()
|
||||
apply_dynamic_human_icon(src, mob_spawn_path = /obj/effect/mob_spawn/corpse/human/nanotrasensoldier, r_hand = held_item)
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/nanotrasenpeace/Aggro()
|
||||
..()
|
||||
summon_backup(15)
|
||||
say("411 in progress, requesting backup!")
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/nanotrasenpeace/ranged
|
||||
vision_range = 9
|
||||
rapid = 3
|
||||
ranged = 1
|
||||
retreat_distance = 3
|
||||
minimum_distance = 5
|
||||
casingtype = /obj/item/ammo_casing/c46x30mm
|
||||
projectilesound = 'sound/weapons/gun/smg/shot.ogg'
|
||||
loot = list(/obj/item/gun/ballistic/automatic/wt550,
|
||||
/obj/effect/mob_spawn/corpse/human/nanotrasensoldier)
|
||||
held_item = /obj/item/gun/ballistic/automatic/wt550
|
||||
|
||||
@@ -2,9 +2,6 @@
|
||||
name = "Pirate"
|
||||
desc = "Does what he wants cause a pirate is free."
|
||||
icon = 'icons/mob/simple/simple_human.dmi'
|
||||
icon_state = "piratemelee"
|
||||
icon_living = "piratemelee"
|
||||
icon_dead = "pirate_dead"
|
||||
mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
|
||||
sentience_type = SENTIENCE_HUMANOID
|
||||
speak_chance = 0
|
||||
@@ -24,17 +21,20 @@
|
||||
atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
|
||||
unsuitable_atmos_damage = 7.5
|
||||
speak_emote = list("yarrs")
|
||||
loot = list(/obj/effect/mob_spawn/corpse/human/pirate,
|
||||
/obj/item/melee/energy/sword/pirate)
|
||||
del_on_death = 1
|
||||
loot = list(/obj/effect/mob_spawn/corpse/human/pirate)
|
||||
del_on_death = TRUE
|
||||
faction = list("pirate")
|
||||
/// Path of the mob spawner we base the mob's visuals off of.
|
||||
var/mob_spawner = /obj/effect/mob_spawn/corpse/human/pirate
|
||||
/// Path of the held item we give to the mob's visuals.
|
||||
var/held_item
|
||||
|
||||
/mob/living/simple_animal/hostile/pirate/Initialize(mapload)
|
||||
. = ..()
|
||||
apply_dynamic_human_icon(src, mob_spawn_path = mob_spawner, r_hand = held_item)
|
||||
|
||||
/mob/living/simple_animal/hostile/pirate/melee
|
||||
name = "Pirate Swashbuckler"
|
||||
icon_state = "piratemelee"
|
||||
icon_living = "piratemelee"
|
||||
icon_dead = "piratemelee_dead"
|
||||
melee_damage_lower = 30
|
||||
melee_damage_upper = 30
|
||||
armour_penetration = 35
|
||||
@@ -42,40 +42,31 @@
|
||||
attack_verb_simple = "slash"
|
||||
attack_sound = 'sound/weapons/blade1.ogg'
|
||||
attack_vis_effect = ATTACK_EFFECT_SLASH
|
||||
var/obj/effect/light_emitter/red_energy_sword/sord
|
||||
|
||||
loot = list(/obj/effect/mob_spawn/corpse/human/pirate/melee)
|
||||
light_range = 2
|
||||
light_power = 2.5
|
||||
light_color = COLOR_SOFT_RED
|
||||
footstep_type = FOOTSTEP_MOB_SHOE
|
||||
loot = list(
|
||||
/obj/effect/mob_spawn/corpse/human/pirate/melee,
|
||||
/obj/item/melee/energy/sword/pirate,
|
||||
)
|
||||
mob_spawner = /obj/effect/mob_spawn/corpse/human/pirate/melee
|
||||
held_item = /obj/item/melee/energy/sword/pirate
|
||||
|
||||
/mob/living/simple_animal/hostile/pirate/melee/space
|
||||
name = "Space Pirate Swashbuckler"
|
||||
icon_state = "piratespace"
|
||||
icon_living = "piratespace"
|
||||
icon_dead = "piratespace_dead"
|
||||
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
|
||||
minbodytemp = 0
|
||||
speed = 1
|
||||
mob_spawner = /obj/effect/mob_spawn/corpse/human/pirate/melee/space
|
||||
|
||||
/mob/living/simple_animal/hostile/pirate/melee/space/Initialize(mapload)
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT)
|
||||
|
||||
/mob/living/simple_animal/hostile/pirate/melee/Initialize(mapload)
|
||||
. = ..()
|
||||
sord = new(src)
|
||||
|
||||
/mob/living/simple_animal/hostile/pirate/melee/Destroy()
|
||||
QDEL_NULL(sord)
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/pirate/melee/Initialize(mapload)
|
||||
. = ..()
|
||||
set_light(2)
|
||||
|
||||
/mob/living/simple_animal/hostile/pirate/ranged
|
||||
name = "Pirate Gunner"
|
||||
icon_state = "pirateranged"
|
||||
icon_living = "pirateranged"
|
||||
icon_dead = "pirateranged_dead"
|
||||
projectilesound = 'sound/weapons/laser.ogg'
|
||||
ranged = 1
|
||||
rapid = 2
|
||||
@@ -84,15 +75,16 @@
|
||||
minimum_distance = 5
|
||||
projectiletype = /obj/projectile/beam/laser
|
||||
loot = list(/obj/effect/mob_spawn/corpse/human/pirate/ranged)
|
||||
mob_spawner = /obj/effect/mob_spawn/corpse/human/pirate/ranged
|
||||
held_item = /obj/item/gun/energy/laser
|
||||
|
||||
/mob/living/simple_animal/hostile/pirate/ranged/space
|
||||
name = "Space Pirate Gunner"
|
||||
icon_state = "piratespaceranged"
|
||||
icon_living = "piratespaceranged"
|
||||
icon_dead = "piratespaceranged_dead"
|
||||
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
|
||||
minbodytemp = 0
|
||||
speed = 1
|
||||
mob_spawner = /obj/effect/mob_spawn/corpse/human/pirate/ranged/space
|
||||
held_item = /obj/item/gun/energy/e_gun/lethal
|
||||
|
||||
/mob/living/simple_animal/hostile/pirate/ranged/space/Initialize(mapload)
|
||||
. = ..()
|
||||
|
||||
@@ -27,52 +27,3 @@
|
||||
environment_smash = ENVIRONMENT_SMASH_NONE
|
||||
del_on_death = 0
|
||||
footstep_type = FOOTSTEP_MOB_SHOE
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/nanotrasenpeace //this should be in a different file
|
||||
name = "\improper Nanotrasen Private Security Officer"
|
||||
desc = "An officer part of Nanotrasen's private security force."
|
||||
icon = 'icons/mob/simple/simple_human.dmi'
|
||||
icon_state = "nanotrasen"
|
||||
icon_living = "nanotrasen"
|
||||
icon_dead = null
|
||||
icon_gib = "syndicate_gib"
|
||||
turns_per_move = 5
|
||||
speed = 0
|
||||
stat_attack = HARD_CRIT
|
||||
robust_searching = 1
|
||||
vision_range = 3
|
||||
maxHealth = 100
|
||||
health = 100
|
||||
harm_intent_damage = 5
|
||||
melee_damage_lower = 10
|
||||
melee_damage_upper = 15
|
||||
attack_verb_continuous = "punches"
|
||||
attack_verb_simple = "punch"
|
||||
attack_sound = 'sound/weapons/punch1.ogg'
|
||||
faction = list("nanotrasenprivate")
|
||||
mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
|
||||
sentience_type = SENTIENCE_HUMANOID
|
||||
combat_mode = TRUE
|
||||
loot = list(/obj/effect/mob_spawn/corpse/human/nanotrasensoldier)
|
||||
atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
|
||||
unsuitable_atmos_damage = 7.5
|
||||
status_flags = CANPUSH
|
||||
search_objects = 1
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/nanotrasenpeace/Aggro()
|
||||
..()
|
||||
summon_backup(15)
|
||||
say("411 in progress, requesting backup!")
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/nanotrasenpeace/ranged
|
||||
icon_state = "nanotrasenrangedsmg"
|
||||
icon_living = "nanotrasenrangedsmg"
|
||||
vision_range = 9
|
||||
rapid = 3
|
||||
ranged = 1
|
||||
retreat_distance = 3
|
||||
minimum_distance = 5
|
||||
casingtype = /obj/item/ammo_casing/c46x30mm
|
||||
projectilesound = 'sound/weapons/gun/smg/shot.ogg'
|
||||
loot = list(/obj/item/gun/ballistic/automatic/wt550,
|
||||
/obj/effect/mob_spawn/corpse/human/nanotrasensoldier)
|
||||
|
||||
@@ -26,27 +26,35 @@
|
||||
unsuitable_atmos_damage = 7.5
|
||||
faction = list("russian")
|
||||
status_flags = CANPUSH
|
||||
del_on_death = 1
|
||||
|
||||
footstep_type = FOOTSTEP_MOB_SHOE
|
||||
del_on_death = TRUE
|
||||
/// The mob spawner we base the icon off of.
|
||||
var/mob_spawner = /obj/effect/mob_spawn/corpse/human/russian
|
||||
/// The item the icon will hold.
|
||||
var/held_item = /obj/item/knife/kitchen
|
||||
|
||||
/mob/living/simple_animal/hostile/russian/Initialize(mapload)
|
||||
. = ..()
|
||||
apply_dynamic_human_icon(src, mob_spawn_path = mob_spawner, r_hand = held_item)
|
||||
|
||||
/mob/living/simple_animal/hostile/russian/ranged
|
||||
icon_state = "russianranged"
|
||||
icon_living = "russianranged"
|
||||
loot = list(/obj/effect/mob_spawn/corpse/human/russian/ranged,
|
||||
/obj/item/gun/ballistic/revolver/nagant)
|
||||
ranged = 1
|
||||
ranged = TRUE
|
||||
retreat_distance = 5
|
||||
minimum_distance = 5
|
||||
projectilesound = 'sound/weapons/gun/revolver/shot.ogg'
|
||||
casingtype = /obj/item/ammo_casing/n762
|
||||
|
||||
mob_spawner = /obj/effect/mob_spawn/corpse/human/russian/ranged
|
||||
held_item = /obj/item/gun/ballistic/revolver/nagant
|
||||
|
||||
/mob/living/simple_animal/hostile/russian/ranged/mosin
|
||||
loot = list(/obj/effect/mob_spawn/corpse/human/russian/ranged,
|
||||
/obj/item/gun/ballistic/rifle/boltaction)
|
||||
casingtype = /obj/item/ammo_casing/a762
|
||||
held_item = /obj/item/gun/ballistic/rifle/boltaction
|
||||
|
||||
/mob/living/simple_animal/hostile/russian/ranged/trooper
|
||||
icon_state = "russianrangedelite"
|
||||
@@ -56,6 +64,8 @@
|
||||
casingtype = /obj/item/ammo_casing/shotgun/buckshot
|
||||
loot = list(/obj/effect/mob_spawn/corpse/human/russian/ranged/trooper,
|
||||
/obj/item/gun/ballistic/shotgun/lethal)
|
||||
mob_spawner = /obj/effect/mob_spawn/corpse/human/russian/ranged/trooper
|
||||
held_item = /obj/item/gun/ballistic/shotgun/lethal
|
||||
|
||||
/mob/living/simple_animal/hostile/russian/ranged/officer
|
||||
name = "Russian Officer"
|
||||
@@ -67,6 +77,8 @@
|
||||
casingtype = /obj/item/ammo_casing/c9mm
|
||||
loot = list(/obj/effect/mob_spawn/corpse/human/russian/ranged/officer,
|
||||
/obj/item/gun/ballistic/automatic/pistol/aps)
|
||||
mob_spawner = /obj/effect/mob_spawn/corpse/human/russian/ranged/officer
|
||||
held_item = /obj/item/gun/ballistic/automatic/pistol/aps
|
||||
|
||||
/mob/living/simple_animal/hostile/russian/ranged/officer/Aggro()
|
||||
..()
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
/mob/living/simple_animal/hostile/skeleton
|
||||
name = "reanimated skeleton"
|
||||
desc = "A real bonefied skeleton, doesn't seem like it wants to socialize."
|
||||
icon = 'icons/mob/simple/simple_human.dmi'
|
||||
icon_state = "skeleton"
|
||||
icon_living = "skeleton"
|
||||
icon_dead = "skeleton"
|
||||
gender = NEUTER
|
||||
icon = 'icons/mob/simple/simple_human.dmi'
|
||||
mob_biotypes = MOB_UNDEAD|MOB_HUMANOID
|
||||
turns_per_move = 5
|
||||
speak_emote = list("rattles")
|
||||
@@ -31,36 +28,47 @@
|
||||
faction = list("skeleton")
|
||||
see_in_dark = NIGHTVISION_FOV_RANGE
|
||||
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
|
||||
death_message = "collapses into a pile of bones!"
|
||||
del_on_death = 1
|
||||
loot = list(/obj/effect/decal/remains/human)
|
||||
|
||||
footstep_type = FOOTSTEP_MOB_SHOE
|
||||
death_message = "collapses into a pile of bones!"
|
||||
del_on_death = TRUE
|
||||
loot = list(/obj/effect/decal/remains/human)
|
||||
/// Path of the outfit we give to the mob's visuals.
|
||||
var/outfit = null
|
||||
/// Path of the species we give to the mob's visuals.
|
||||
var/species = /datum/species/skeleton
|
||||
/// Path of the held item we give to the mob's visuals.
|
||||
var/held_item
|
||||
|
||||
/mob/living/simple_animal/hostile/skeleton/Initialize(mapload)
|
||||
. = ..()
|
||||
apply_dynamic_human_icon(src, outfit, species, r_hand = held_item)
|
||||
|
||||
/mob/living/simple_animal/hostile/skeleton/eskimo
|
||||
name = "undead eskimo"
|
||||
desc = "The reanimated remains of some poor traveler."
|
||||
icon_state = "eskimo"
|
||||
icon_living = "eskimo"
|
||||
icon_dead = "eskimo_dead"
|
||||
maxHealth = 55
|
||||
health = 55
|
||||
weather_immunities = list(TRAIT_SNOWSTORM_IMMUNE)
|
||||
melee_damage_lower = 17
|
||||
melee_damage_upper = 20
|
||||
death_message = "collapses into a pile of bones, its gear falling to the floor!"
|
||||
loot = list(/obj/effect/decal/remains/human,
|
||||
/obj/item/spear,
|
||||
/obj/item/clothing/shoes/winterboots,
|
||||
/obj/item/clothing/suit/hooded/wintercoat)
|
||||
loot = list(
|
||||
/obj/effect/decal/remains/human,
|
||||
/obj/item/spear,
|
||||
/obj/item/clothing/shoes/winterboots,
|
||||
/obj/item/clothing/suit/hooded/wintercoat,
|
||||
)
|
||||
outfit = /datum/outfit/eskimo
|
||||
held_item = /obj/item/spear
|
||||
|
||||
/datum/outfit/eskimo
|
||||
name = "Eskimo"
|
||||
suit = /obj/item/clothing/suit/hooded/wintercoat
|
||||
shoes = /obj/item/clothing/shoes/winterboots
|
||||
|
||||
/mob/living/simple_animal/hostile/skeleton/templar
|
||||
name = "undead templar"
|
||||
desc = "The reanimated remains of a holy templar knight."
|
||||
icon_state = "templar"
|
||||
icon_living = "templar"
|
||||
icon_dead = "templar_dead"
|
||||
maxHealth = 150
|
||||
health = 150
|
||||
weather_immunities = list(TRAIT_SNOWSTORM_IMMUNE)
|
||||
@@ -72,10 +80,19 @@
|
||||
melee_damage_lower = 25
|
||||
melee_damage_upper = 30
|
||||
death_message = "collapses into a pile of bones, its gear clanging as it hits the ground!"
|
||||
loot = list(/obj/effect/decal/remains/human,
|
||||
/obj/item/clothing/suit/chaplainsuit/armor/templar,
|
||||
/obj/item/clothing/head/helmet/chaplain,
|
||||
/obj/item/claymore/weak{name = "holy sword"})
|
||||
loot = list(
|
||||
/obj/effect/decal/remains/human,
|
||||
/obj/item/clothing/suit/chaplainsuit/armor/templar,
|
||||
/obj/item/clothing/head/helmet/chaplain,
|
||||
/obj/item/claymore/weak{name = "holy sword"}
|
||||
)
|
||||
outfit = /datum/outfit/templar
|
||||
|
||||
/datum/outfit/templar
|
||||
name = "Templar"
|
||||
head = /obj/item/clothing/head/helmet/chaplain
|
||||
suit = /obj/item/clothing/suit/chaplainsuit/armor/templar
|
||||
r_hand = /obj/item/claymore/weak
|
||||
|
||||
/mob/living/simple_animal/hostile/skeleton/ice
|
||||
name = "ice skeleton"
|
||||
@@ -99,8 +116,11 @@
|
||||
melee_damage_lower = 15
|
||||
melee_damage_upper = 20
|
||||
light_color = LIGHT_COLOR_PURPLE
|
||||
light_range = 2
|
||||
death_message = "collapses into a pile of bones, their suit dissolving among the plasma!"
|
||||
loot = list(/obj/effect/decal/remains/plasma)
|
||||
outfit = /datum/outfit/plasma_miner
|
||||
species = /datum/species/plasmaman
|
||||
|
||||
/mob/living/simple_animal/hostile/skeleton/plasmaminer/jackhammer
|
||||
desc = "A plasma-soaked miner, their exposed limbs turned into a grossly incandescent bone seemingly made of plasma. They seem to still have their mining tool in their hand, gripping tightly."
|
||||
@@ -117,7 +137,10 @@
|
||||
attack_sound = 'sound/weapons/sonic_jackhammer.ogg'
|
||||
attack_vis_effect = null // jackhammer moment
|
||||
loot = list(/obj/effect/decal/remains/plasma, /obj/item/pickaxe/drill/jackhammer)
|
||||
held_item = /obj/item/pickaxe/drill/jackhammer
|
||||
|
||||
/mob/living/simple_animal/hostile/skeleton/plasmaminer/Initialize(mapload)
|
||||
. = ..()
|
||||
set_light(2)
|
||||
/datum/outfit/plasma_miner
|
||||
name = "Plasma Miner"
|
||||
uniform = /obj/item/clothing/under/rank/cargo/miner/lavaland
|
||||
suit = /obj/item/clothing/suit/hooded/explorer
|
||||
mask = /obj/item/clothing/mask/gas/explorer
|
||||
|
||||
@@ -40,6 +40,7 @@
|
||||
|
||||
/mob/living/simple_animal/hostile/wizard/Initialize(mapload)
|
||||
. = ..()
|
||||
apply_dynamic_human_icon(src, mob_spawn_path = /obj/effect/mob_spawn/corpse/human/wizard, r_hand = /obj/item/staff)
|
||||
var/obj/item/implant/exile/exiled = new /obj/item/implant/exile(src)
|
||||
exiled.implant(src)
|
||||
|
||||
|
||||
@@ -2,8 +2,6 @@
|
||||
name = "Shambling Corpse"
|
||||
desc = "When there is no more room in hell, the dead will walk in outer space."
|
||||
icon = 'icons/mob/simple/simple_human.dmi'
|
||||
icon_state = "zombie"
|
||||
icon_living = "zombie"
|
||||
mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
|
||||
sentience_type = SENTIENCE_HUMANOID
|
||||
speak_chance = 0
|
||||
@@ -21,28 +19,33 @@
|
||||
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
|
||||
minbodytemp = 0
|
||||
status_flags = CANPUSH
|
||||
del_on_death = 1
|
||||
var/zombiejob = JOB_MEDICAL_DOCTOR
|
||||
death_message = "collapses, flesh gone in a pile of bones!"
|
||||
del_on_death = TRUE
|
||||
loot = list(/obj/effect/decal/remains/human)
|
||||
/// The probability that we give people real zombie infections on hit.
|
||||
var/infection_chance = 0
|
||||
/// Outfit the zombie spawns with for visuals.
|
||||
var/outfit = /datum/outfit/corpse_doctor
|
||||
|
||||
/mob/living/simple_animal/hostile/zombie/Initialize(mapload)
|
||||
. = ..()
|
||||
INVOKE_ASYNC(src, PROC_REF(setup_visuals))
|
||||
|
||||
/mob/living/simple_animal/hostile/zombie/proc/setup_visuals()
|
||||
var/datum/job/job = SSjob.GetJob(zombiejob)
|
||||
|
||||
var/datum/outfit/outfit = new job.outfit
|
||||
outfit.l_hand = null
|
||||
outfit.r_hand = null
|
||||
|
||||
var/mob/living/carbon/human/dummy/dummy = new
|
||||
dummy.equipOutfit(outfit)
|
||||
dummy.set_species(/datum/species/zombie)
|
||||
icon = getFlatIcon(dummy)
|
||||
qdel(dummy)
|
||||
apply_dynamic_human_icon(src, outfit, /datum/species/zombie, bloody_slots = ITEM_SLOT_OCLOTHING)
|
||||
|
||||
/mob/living/simple_animal/hostile/zombie/AttackingTarget()
|
||||
. = ..()
|
||||
if(. && ishuman(target) && prob(infection_chance))
|
||||
try_to_zombie_infect(target)
|
||||
|
||||
/datum/outfit/corpse_doctor
|
||||
name = "Corpse Doctor"
|
||||
suit = /obj/item/clothing/suit/toggle/labcoat
|
||||
uniform = /obj/item/clothing/under/rank/medical/doctor
|
||||
shoes = /obj/item/clothing/shoes/sneakers/white
|
||||
back = /obj/item/storage/backpack/medic
|
||||
|
||||
/datum/outfit/corpse_assistant
|
||||
name = "Corpse Assistant"
|
||||
mask = /obj/item/clothing/mask/gas
|
||||
uniform = /obj/item/clothing/under/color/grey
|
||||
shoes = /obj/item/clothing/shoes/sneakers/black
|
||||
back = /obj/item/storage/backpack
|
||||
|
||||
@@ -65,6 +65,27 @@
|
||||
id = /obj/item/card/id/advanced/chameleon
|
||||
id_trim = /datum/id_trim/chameleon/operative
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/syndicatepilot
|
||||
name = "Syndicate Pilot"
|
||||
hairstyle = "Bald"
|
||||
facial_hairstyle = "Shaved"
|
||||
outfit = /datum/outfit/syndicatepilotcorpse
|
||||
|
||||
/datum/outfit/syndicatepilotcorpse
|
||||
name = "Syndicate Pilot Corpse"
|
||||
uniform = /obj/item/clothing/under/syndicate
|
||||
suit = /obj/item/clothing/suit/armor/vest/alt
|
||||
shoes = /obj/item/clothing/shoes/combat
|
||||
neck = /obj/item/clothing/neck/large_scarf/syndie
|
||||
glasses = /obj/item/clothing/glasses/cold
|
||||
gloves = /obj/item/clothing/gloves/combat
|
||||
ears = /obj/item/radio/headset
|
||||
mask = /obj/item/clothing/mask/gas
|
||||
head = /obj/item/clothing/head/helmet/swat
|
||||
back = /obj/item/storage/backpack
|
||||
id = /obj/item/card/id/advanced/chameleon
|
||||
id_trim = /datum/id_trim/chameleon/operative
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/pirate
|
||||
name = "Pirate"
|
||||
skin_tone = "caucasian1" //all pirates are white because it's easier that way
|
||||
@@ -76,9 +97,25 @@
|
||||
name = "Pirate Corpse"
|
||||
uniform = /obj/item/clothing/under/costume/pirate
|
||||
shoes = /obj/item/clothing/shoes/jackboots
|
||||
glasses = /obj/item/clothing/glasses/eyepatch
|
||||
head = /obj/item/clothing/head/costume/pirate/bandana
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/pirate/melee
|
||||
name = "Pirate Swashbuckler"
|
||||
outfit = /datum/outfit/piratecorpse/melee
|
||||
|
||||
/datum/outfit/piratecorpse/melee
|
||||
name = "Pirate Swashbuckler Corpse"
|
||||
glasses = /obj/item/clothing/glasses/eyepatch
|
||||
head = /obj/item/clothing/head/costume/pirate/bandana/armored
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/pirate/melee/space
|
||||
name = "Pirate Swashbuckler - Space"
|
||||
outfit = /datum/outfit/piratecorpse/melee/space
|
||||
|
||||
/datum/outfit/piratecorpse/melee/space
|
||||
name = "Pirate Swashbuckler Corpse - Space"
|
||||
suit = /obj/item/clothing/suit/space/pirate
|
||||
head = /obj/item/clothing/head/helmet/space/pirate/bandana
|
||||
back = /obj/item/tank/jetpack/carbondioxide
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/pirate/ranged
|
||||
name = "Pirate Gunner"
|
||||
@@ -86,9 +123,19 @@
|
||||
|
||||
/datum/outfit/piratecorpse/ranged
|
||||
name = "Pirate Gunner Corpse"
|
||||
suit = /obj/item/clothing/suit/costume/pirate
|
||||
head = /obj/item/clothing/head/costume/pirate
|
||||
glasses = /obj/item/clothing/glasses/eyepatch
|
||||
suit = /obj/item/clothing/suit/costume/pirate/armored
|
||||
head = /obj/item/clothing/head/costume/pirate/armored
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/pirate/ranged/space
|
||||
name = "Pirate Gunner - Space"
|
||||
outfit = /datum/outfit/piratecorpse/ranged/space
|
||||
|
||||
/datum/outfit/piratecorpse/ranged/space
|
||||
name = "Pirate Gunner Corpse - Space"
|
||||
suit = /obj/item/clothing/suit/space/pirate
|
||||
head = /obj/item/clothing/head/helmet/space/pirate
|
||||
back = /obj/item/tank/jetpack/carbondioxide
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/russian
|
||||
name = "Russian"
|
||||
@@ -156,15 +203,32 @@
|
||||
shoes = /obj/item/clothing/shoes/sandal/magic
|
||||
head = /obj/item/clothing/head/wizard
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/wizard/dark
|
||||
name = "Dark Wizard Corpse"
|
||||
outfit = /datum/outfit/wizardcorpse/dark
|
||||
|
||||
/datum/outfit/wizardcorpse/dark
|
||||
head = /obj/item/clothing/head/wizard/hood
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/wizard/paper
|
||||
name = "Paper Wizard Corpse"
|
||||
outfit = /datum/outfit/paper_wizard
|
||||
|
||||
/datum/outfit/paper_wizard
|
||||
name = "Paper Wizard"
|
||||
uniform = /obj/item/clothing/under/color/white
|
||||
suit = /obj/item/clothing/suit/wizrobe/paper
|
||||
shoes = /obj/item/clothing/shoes/sandal/magic
|
||||
head = /obj/item/clothing/head/collectable/paper
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/nanotrasensoldier
|
||||
name = "\improper Nanotrasen Private Security Officer"
|
||||
outfit = /datum/outfit/nanotrasensoldiercorpse2
|
||||
outfit = /datum/outfit/nanotrasensoldiercorpse
|
||||
hairstyle = "Bald"
|
||||
facial_hairstyle = "Shaved"
|
||||
|
||||
/datum/outfit/nanotrasensoldiercorpse2
|
||||
name = "NT Private Security Officer Corpse"
|
||||
/datum/outfit/nanotrasensoldiercorpse
|
||||
name = "\improper NT Private Security Officer Corpse"
|
||||
uniform = /obj/item/clothing/under/rank/security/officer
|
||||
suit = /obj/item/clothing/suit/armor/vest
|
||||
shoes = /obj/item/clothing/shoes/combat
|
||||
@@ -177,13 +241,13 @@
|
||||
id_trim = /datum/id_trim/centcom/corpse/private_security/tradepost_officer
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/nanotrasenassaultsoldier
|
||||
name = "Nanotrasen Private Security Officer"
|
||||
name = "\improper Nanotrasen Assault Officer Corpse"
|
||||
outfit = /datum/outfit/nanotrasenassaultsoldiercorpse
|
||||
hairstyle = "Bald"
|
||||
facial_hairstyle = "Shaved"
|
||||
|
||||
/datum/outfit/nanotrasenassaultsoldiercorpse
|
||||
name = "NT Assault Officer Corpse"
|
||||
name = "\improper NT Assault Officer Corpse"
|
||||
uniform = /obj/item/clothing/under/syndicate
|
||||
suit = /obj/item/clothing/suit/armor/vest
|
||||
shoes = /obj/item/clothing/shoes/combat
|
||||
@@ -195,6 +259,22 @@
|
||||
id = /obj/item/card/id/advanced/centcom
|
||||
id_trim = /datum/id_trim/centcom/corpse/assault
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/nanotrasenelitesoldier
|
||||
name = "\improper Nanotrasen Elite Assault Officer Corpse"
|
||||
outfit = /datum/outfit/nanotrasenelitesoldiercorpse
|
||||
hairstyle = "Bald"
|
||||
facial_hairstyle = "Shaved"
|
||||
|
||||
/datum/outfit/nanotrasenelitesoldiercorpse
|
||||
name = "\improper NT Elite Assault Officer Corpse"
|
||||
uniform = /obj/item/clothing/under/rank/centcom/military
|
||||
shoes = /obj/item/clothing/shoes/combat
|
||||
gloves = /obj/item/clothing/gloves/combat
|
||||
mask = /obj/item/clothing/mask/gas/sechailer/swat
|
||||
back = /obj/item/mod/control/pre_equipped/responsory/security
|
||||
id = /obj/item/card/id/advanced/centcom
|
||||
id_trim = /datum/id_trim/centcom/ert/security
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/cat_butcher
|
||||
name = "The Cat Surgeon"
|
||||
hairstyle = "Cut Hair"
|
||||
@@ -229,3 +309,11 @@
|
||||
id = /obj/item/card/id/advanced
|
||||
l_pocket = /obj/item/paper/fluff/bee_objectives
|
||||
mask = /obj/item/clothing/mask/animal/small/bee
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/generic_assistant
|
||||
name = "Generic Assistant"
|
||||
hairstyle = "Short Hair"
|
||||
haircolor = COLOR_BLACK
|
||||
facial_hairstyle = "Shaved"
|
||||
skin_tone = "caucasian1"
|
||||
outfit = /datum/outfit/job/assistant/consistent
|
||||
|
||||
@@ -255,10 +255,14 @@
|
||||
notify_ghosts("An ash walker egg is ready to hatch in \the [spawner_area.name].", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_ASHWALKER)
|
||||
|
||||
/datum/outfit/ashwalker
|
||||
name ="Ashwalker"
|
||||
name = "Ash Walker"
|
||||
head = /obj/item/clothing/head/helmet/gladiator
|
||||
uniform = /obj/item/clothing/under/costume/gladiator/ash_walker
|
||||
|
||||
/datum/outfit/ashwalker/spear
|
||||
name = "Ash Walker - Spear"
|
||||
back = /obj/item/spear/bonespear
|
||||
|
||||
///Syndicate Listening Post
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/lavaland_syndicate
|
||||
|
||||
@@ -207,8 +207,10 @@
|
||||
///burn damage this corpse will spawn with
|
||||
var/burn_damage = 0
|
||||
|
||||
/obj/effect/mob_spawn/corpse/Initialize(mapload)
|
||||
/obj/effect/mob_spawn/corpse/Initialize(mapload, no_spawn)
|
||||
. = ..()
|
||||
if(no_spawn)
|
||||
return
|
||||
switch(spawn_when)
|
||||
if(CORPSE_INSTANT)
|
||||
INVOKE_ASYNC(src, PROC_REF(create))
|
||||
|
||||
@@ -417,9 +417,11 @@
|
||||
if(wearer.stat < UNCONSCIOUS && prob(10))
|
||||
wearer.emote("scream")
|
||||
|
||||
/obj/item/mod/control/visual_equipped(mob/user, slot, initial = FALSE)
|
||||
if(slot & slot_flags)
|
||||
set_wearer(user)
|
||||
|
||||
/obj/item/mod/control/on_outfit_equip(mob/living/carbon/human/outfit_wearer, visuals_only, item_slot)
|
||||
if(visuals_only)
|
||||
set_wearer(outfit_wearer) //we need to set wearer manually since it doesnt call equipped
|
||||
quick_activation()
|
||||
|
||||
/obj/item/mod/control/doStrip(mob/stripper, mob/owner)
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
return TRUE
|
||||
|
||||
/obj/item/ammo_casing/proc/tk_firing(mob/living/user, atom/fired_from)
|
||||
return !user.contains(fired_from)
|
||||
return fired_from != user && !user.contains(fired_from)
|
||||
|
||||
/obj/item/ammo_casing/proc/ready_proj(atom/target, mob/living/user, quiet, zone_override = "", atom/fired_from)
|
||||
if (!loaded_projectile)
|
||||
|
||||
@@ -23,6 +23,9 @@
|
||||
desc = "A 5.56mm phasic bullet casing."
|
||||
projectile_type = /obj/projectile/bullet/a556/phasic
|
||||
|
||||
/obj/item/ammo_casing/a556/weak
|
||||
projectile_type = /obj/projectile/bullet/a556/weak
|
||||
|
||||
// 40mm (Grenade Launcher)
|
||||
|
||||
/obj/item/ammo_casing/a40mm
|
||||
|
||||
@@ -132,7 +132,7 @@
|
||||
// Sometimes ammo_type has paths, sometimes it has atom.
|
||||
for (var/atom/item in ammo_type)
|
||||
qdel(item)
|
||||
ammo_type -= item
|
||||
ammo_type = null
|
||||
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -164,3 +164,6 @@
|
||||
. += "[icon_state]_fail_1"
|
||||
if(151 to INFINITY)
|
||||
. += "[icon_state]_fail_2"
|
||||
|
||||
/obj/item/gun/energy/e_gun/lethal
|
||||
ammo_type = list(/obj/item/ammo_casing/energy/laser, /obj/item/ammo_casing/energy/disabler)
|
||||
|
||||
@@ -48,6 +48,9 @@
|
||||
overlay_x = 18, \
|
||||
overlay_y = 12)
|
||||
|
||||
/obj/item/gun/energy/pulse/carbine/lethal
|
||||
ammo_type = list(/obj/item/ammo_casing/energy/laser, /obj/item/ammo_casing/energy/laser/pulse, /obj/item/ammo_casing/energy/electrode)
|
||||
|
||||
/obj/item/gun/energy/pulse/carbine/loyalpin
|
||||
pin = /obj/item/firing_pin/implant/mindshield
|
||||
|
||||
|
||||
@@ -6,6 +6,9 @@
|
||||
armour_penetration = 30
|
||||
wound_bonus = -40
|
||||
|
||||
/obj/projectile/bullet/a556/weak //centcom
|
||||
damage = 20
|
||||
|
||||
/obj/projectile/bullet/a556/phasic
|
||||
name = "5.56mm phasic bullet"
|
||||
icon_state = "gaussphase"
|
||||
|
||||
@@ -383,7 +383,7 @@
|
||||
duration = 300
|
||||
|
||||
/datum/status_effect/spookcookie/on_apply()
|
||||
var/image/I = image(icon = 'icons/mob/simple/simple_human.dmi', icon_state = "skeleton", layer = ABOVE_MOB_LAYER, loc = owner)
|
||||
var/image/I = image(icon = 'icons/mob/species/human/human.dmi', icon_state = "skeleton", layer = ABOVE_MOB_LAYER, loc = owner)
|
||||
I.override = 1
|
||||
owner.add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/everyone, "spookyscary", I)
|
||||
return ..()
|
||||
|
||||
@@ -19,6 +19,8 @@
|
||||
|
||||
// Test preset delusion hallucinations for invalid image setups
|
||||
for(var/datum/hallucination/delusion/preset/hallucination as anything in subtypesof(/datum/hallucination/delusion/preset))
|
||||
if(initial(hallucination.dynamic_icon))
|
||||
continue
|
||||
var/icon = initial(hallucination.delusion_icon_file)
|
||||
var/icon_state = initial(hallucination.delusion_icon_state)
|
||||
check_hallucination_icon(hallucination, icon, icon_state)
|
||||
|
||||
|
Before Width: | Height: | Size: 821 B After Width: | Height: | Size: 854 B |
|
Before Width: | Height: | Size: 821 B After Width: | Height: | Size: 854 B |
|
Before Width: | Height: | Size: 821 B After Width: | Height: | Size: 854 B |
|
Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 5.5 KiB |
|
Before Width: | Height: | Size: 96 KiB After Width: | Height: | Size: 373 B |
|
After Width: | Height: | Size: 3.8 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 365 B |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
@@ -336,6 +336,7 @@
|
||||
#include "code\__HELPERS\datums.dm"
|
||||
#include "code\__HELPERS\dna.dm"
|
||||
#include "code\__HELPERS\duplicating.dm"
|
||||
#include "code\__HELPERS\dynamic_human_icon_gen.dm"
|
||||
#include "code\__HELPERS\files.dm"
|
||||
#include "code\__HELPERS\filters.dm"
|
||||
#include "code\__HELPERS\forensics.dm"
|
||||
|
||||