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

![image](https://user-images.githubusercontent.com/23585223/211064291-81070650-189f-4afa-8116-81b687e3ea35.png)

## 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>
This commit is contained in:
Fikou
2023-01-18 21:04:10 +01:00
committed by GitHub
parent b520d5342f
commit 519bf69869
55 changed files with 804 additions and 475 deletions
+2 -7
View File
@@ -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,
+2 -2
View File
@@ -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)
+3 -3
View File
@@ -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)
+24 -86
View File
@@ -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
+1 -3
View File
@@ -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
+3
View File
@@ -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
+60
View File
@@ -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
+1 -1
View File
@@ -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
+212 -105
View File
@@ -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), \
+26 -1
View File
@@ -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"
-4
View File
@@ -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()
+43 -4
View File
@@ -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"
+5
View File
@@ -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
+4
View File
@@ -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."
+2 -2
View File
@@ -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 -19
View File
@@ -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
+41
View File
@@ -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
+97 -9
View File
@@ -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
+3 -1
View File
@@ -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))
+4 -2
View File
@@ -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
+1 -1
View File
@@ -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)
Binary file not shown.

Before

Width:  |  Height:  |  Size: 821 B

After

Width:  |  Height:  |  Size: 854 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 821 B

After

Width:  |  Height:  |  Size: 854 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 821 B

After

Width:  |  Height:  |  Size: 854 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 96 KiB

After

Width:  |  Height:  |  Size: 373 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 365 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

+1
View File
@@ -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"