Merge branch 'master' of https://github.com/Citadel-Station-13/Citadel-Station-13 into ninjasarecum
This commit is contained in:
@@ -83,6 +83,8 @@
|
||||
#define COMSIG_ATOM_EXIT "atom_exit" //from base of atom/Exit(): (/atom/movable/exiting, /atom/newloc)
|
||||
#define COMPONENT_ATOM_BLOCK_EXIT 1
|
||||
#define COMSIG_ATOM_EXITED "atom_exited" //from base of atom/Exited(): (atom/movable/exiting, atom/newloc)
|
||||
/// From base of atom/wave_ex_act(): (datum/wave_explosion/explosion, args)
|
||||
#define COMSIG_ATOM_WAVE_EX_ACT "atom_wave_ex_act"
|
||||
///from base of atom/ex_act(): (severity, target)
|
||||
#define COMSIG_ATOM_EX_ACT "atom_ex_act"
|
||||
///from base of atom/emp_act(): (severity)
|
||||
|
||||
@@ -0,0 +1,86 @@
|
||||
// THIS IS INSANITY
|
||||
// These are how wave explosions track when there's not only one direction to keep track of (diagonals, etc)
|
||||
#define WEX_DIR_NORTH NORTH
|
||||
#define WEX_DIR_SOUTH SOUTH
|
||||
#define WEX_DIR_EAST EAST
|
||||
#define WEX_DIR_WEST WEST
|
||||
#define WEX_ALLDIRS (WEX_DIR_NORTH | WEX_DIR_SOUTH | WEX_DIR_EAST | WEX_DIR_WEST)
|
||||
|
||||
/// Default explosion power to consider an explosion over
|
||||
#define EXPLOSION_POWER_DEAD 2.5
|
||||
/// Default explosion falloff
|
||||
#define EXPLOSION_DEFAULT_FALLOFF_MULTIPLY 0.98
|
||||
/// Default explosion constant falloff
|
||||
#define EXPLOSION_DEFAULT_FALLOFF_SUBTRACT 5
|
||||
/// Block amount at which point having 0 block resistance will result in a full block
|
||||
#define EXPLOSION_POWER_NO_RESIST_THRESHOLD 5
|
||||
|
||||
/// Explosion power quantization
|
||||
#define EXPLOSION_POWER_QUANTIZATION_ACCURACY 0.1
|
||||
|
||||
// [explosion_flags] variable on /atom
|
||||
/// No blocking if we're not dense
|
||||
#define EXPLOSION_FLAG_DENSITY_DEPENDENT (1<<0)
|
||||
/// If we survive the explosion, we block ALL the power and ignore the results of wave_ex_act().
|
||||
#define EXPLOSION_FLAG_HARD_OBSTACLE (1<<1)
|
||||
|
||||
// Standardized explosion powers
|
||||
/// Maxcap
|
||||
#define EXPLOSION_POWER_MAXCAP 500
|
||||
/// erases shreds from explosions/item damage
|
||||
#define EXPLOSION_POWER_ERASE_SHREDS 400
|
||||
/// Gibs most mobs
|
||||
#define EXPLOSION_POWER_NORMAL_MOB_GIB 400
|
||||
|
||||
// Walls
|
||||
#define EXPLOSION_POWER_WALL_SCRAPE 400
|
||||
#define EXPLOSION_POWER_WALL_DISMANTLE 300
|
||||
#define EXPLOSION_POWER_WALL_MINIMUM_DISMANTLE 200
|
||||
|
||||
#define EXPLOSION_POWER_RWALL_SCRAPE 450
|
||||
#define EXPLOSION_POWER_RWALL_DISMANTLE 400
|
||||
#define EXPLOSION_POWER_RWALL_MINIMUM_DISMANTLE 300
|
||||
|
||||
// Floors
|
||||
#define EXPLOSION_POWER_FLOOR_TILE_BREAK 50
|
||||
#define EXPLOSION_POWER_FLOOR_MINIMUM_TURF_BREAK 125
|
||||
#define EXPLOSION_POWER_FLOOR_TURF_BREAK_BONUS 225
|
||||
#define EXPLOSION_POWER_FLOOR_TURF_BREAK 350
|
||||
#define EXPLOSION_POWER_FLOOR_TURF_SCRAPE 425
|
||||
#define EXPLOSION_POWER_FLOOR_SHIELDED_IMMUNITY 250
|
||||
|
||||
// Helpers
|
||||
/// Explosion power to object damage (without taking into consideration armor)
|
||||
#define EXPLOSION_POWER_STANDARD_SCALE_OBJECT_DAMAGE(power, multiplier) (power>500)?(10*(power**0.6)*multiplier):(0.1*(power**1.3)*multiplier)
|
||||
/// Explosion power to object damage for hard obstacles
|
||||
#define EXPLOSION_POWER_STANDARD_SCALE_HARD_OBSTACLE_DAMAGE(power, multiplier) (power>500)?(10*(power**0.6)*multiplier):(0.15*(power**1.3)*multiplier)
|
||||
/// Explosion power to object damage for windows
|
||||
#define EXPLOSION_POWER_STANDARD_SCALE_WINDOW_DAMAGE(power, multiplier) (power>500)?(10*(power**0.6)*multiplier):(0.2*(power**1.3)*multiplier)
|
||||
/// Default brute damage to do to living things
|
||||
#define EXPLOSION_POWER_STANDARD_SCALE_MOB_DAMAGE(power, multiplier) ((power / 2) * multiplier)
|
||||
|
||||
// Damage factors
|
||||
/// Factor to multiply damage to a door by if it's open (and therefore not blocking the explosion)
|
||||
#define EXPLOSION_DAMAGE_OPEN_DOOR_FACTOR 0.25
|
||||
|
||||
// Standardized explosion constant blocks
|
||||
#define EXPLOSION_BLOCK_WINDOW 10
|
||||
#define EXPLOSION_BLOCK_MACHINE 20
|
||||
#define EXPLOSION_BLOCK_SPACE 20
|
||||
#define EXPLOSION_BLOCK_REINFORCED_WINDOW 50
|
||||
#define EXPLOSION_BLOCK_DENSE_FILLER 50
|
||||
#define EXPLOSION_BLOCK_WALL 75
|
||||
#define EXPLOSION_BLOCK_BLAST_PROOF 250
|
||||
#define EXPLOSION_BLOCK_BOROSILICATE_WINDOW 250
|
||||
#define EXPLOSION_BLOCK_EXTREME 250
|
||||
|
||||
// Standardized explosion factor blocks
|
||||
#define EXPLOSION_DAMPEN_MACHINE 0.95
|
||||
#define EXPLOSION_DAMPEN_SPACE 0.95
|
||||
#define EXPLOSION_DAMPEN_WINDOW 0.95
|
||||
#define EXPLOSION_DAMPEN_REINFORCED_WINDOW 0.9
|
||||
#define EXPLOSION_DAMPEN_DENSE_FILLER 0.85
|
||||
#define EXPLOSION_DAMPEN_WALL 0.8
|
||||
#define EXPLOSION_DAMPEN_BOROSILICATE_WINDOW 0.65
|
||||
#define EXPLOSION_DAMPEN_BLAST_PROOF 0.65
|
||||
#define EXPLOSION_DAMPEN_EXTREME 0.5
|
||||
@@ -77,6 +77,7 @@
|
||||
#define PROJECTILE_HIT_THRESHHOLD_LAYER 2.75 //projectiles won't hit objects at or below this layer if possible
|
||||
#define TABLE_LAYER 2.8
|
||||
#define TRAY_LAYER 2.85
|
||||
#define GATEWAY_UNDERLAY_LAYER 2.85
|
||||
#define BELOW_OBJ_LAYER 2.9
|
||||
#define LOW_ITEM_LAYER 2.95
|
||||
//#define OBJ_LAYER 3 //For easy recordkeeping; this is a byond define
|
||||
|
||||
@@ -180,6 +180,7 @@
|
||||
#define FIRE_PRIORITY_PROJECTILES 200
|
||||
#define FIRE_PRIORITY_TICKER 200
|
||||
#define FIRE_PRIORITY_ATMOS_ADJACENCY 300
|
||||
#define FIRE_PRIORITY_EXPLOSIONS 350
|
||||
#define FIRE_PRIORITY_STATPANEL 390
|
||||
#define FIRE_PRIORITY_CHAT 400
|
||||
#define FIRE_PRIORITY_RUNECHAT 410
|
||||
@@ -219,7 +220,6 @@
|
||||
A.flags_1 &= ~OVERLAY_QUEUED_1;\
|
||||
} while(FALSE)
|
||||
|
||||
|
||||
/**
|
||||
Create a new timer and add it to the queue.
|
||||
* Arguments:
|
||||
|
||||
@@ -14,7 +14,6 @@
|
||||
//socks
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/underwear/socks, GLOB.socks_list)
|
||||
//bodypart accessories (blizzard intensifies)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/body_markings, GLOB.body_markings_list)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/lizard, GLOB.tails_list_lizard)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/tails_animated/lizard, GLOB.animated_tails_list_lizard)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/human, GLOB.tails_list_human)
|
||||
|
||||
+1
-13
@@ -64,8 +64,6 @@
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/spines, GLOB.spines_list)
|
||||
if(!GLOB.legs_list.len)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/legs, GLOB.legs_list)
|
||||
if(!GLOB.body_markings_list.len)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/body_markings, GLOB.body_markings_list)
|
||||
if(!GLOB.wings_list.len)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/wings, GLOB.wings_list)
|
||||
if(!GLOB.deco_wings_list.len)
|
||||
@@ -115,15 +113,6 @@
|
||||
continue
|
||||
if(!S.ckeys_allowed)
|
||||
snowflake_mam_tails_list[S.name] = mtpath
|
||||
var/list/snowflake_markings_list = list()
|
||||
for(var/mmpath in GLOB.mam_body_markings_list)
|
||||
var/datum/sprite_accessory/mam_body_markings/instance = GLOB.mam_body_markings_list[mmpath]
|
||||
if(istype(instance, /datum/sprite_accessory))
|
||||
var/datum/sprite_accessory/S = instance
|
||||
if(intendedspecies && S.recommended_species && !S.recommended_species.Find(intendedspecies))
|
||||
continue
|
||||
if(!S.ckeys_allowed)
|
||||
snowflake_markings_list[S.name] = mmpath
|
||||
var/list/snowflake_ears_list = list()
|
||||
for(var/mepath in GLOB.mam_ears_list)
|
||||
var/datum/sprite_accessory/ears/mam_ears/instance = GLOB.mam_ears_list[mepath]
|
||||
@@ -177,7 +166,6 @@
|
||||
"ears" = "None",
|
||||
"frills" = pick(GLOB.frills_list),
|
||||
"spines" = pick(GLOB.spines_list),
|
||||
"body_markings" = pick(GLOB.body_markings_list),
|
||||
"legs" = pick("Plantigrade","Digitigrade"),
|
||||
"caps" = pick(GLOB.caps_list),
|
||||
"insect_wings" = pick(GLOB.insect_wings_list),
|
||||
@@ -187,7 +175,7 @@
|
||||
"arachnid_spinneret" = pick(GLOB.arachnid_spinneret_list),
|
||||
"arachnid_mandibles" = pick(GLOB.arachnid_mandibles_list),
|
||||
"taur" = "None",
|
||||
"mam_body_markings" = snowflake_markings_list.len ? pick(snowflake_markings_list) : "None",
|
||||
"mam_body_markings" = list(),
|
||||
"mam_ears" = snowflake_ears_list ? pick(snowflake_ears_list) : "None",
|
||||
"mam_snouts" = snowflake_mam_snouts_list ? pick(snowflake_mam_snouts_list) : "None",
|
||||
"mam_tail" = snowflake_mam_tails_list ? pick(snowflake_mam_tails_list) : "None",
|
||||
|
||||
@@ -551,8 +551,7 @@
|
||||
///How many players joined the round.
|
||||
var/total_players = GLOB.joined_player_list.len
|
||||
var/list/typecache_bank = typecacheof(list(/datum/bank_account/department, /datum/bank_account/remote))
|
||||
for(var/i in SSeconomy.generated_accounts)
|
||||
var/datum/bank_account/current_acc = SSeconomy.generated_accounts[i]
|
||||
for(var/datum/bank_account/current_acc in SSeconomy.generated_accounts)
|
||||
if(typecache_bank[current_acc.type])
|
||||
continue
|
||||
station_vault += current_acc.account_balance
|
||||
|
||||
@@ -17,7 +17,6 @@ GLOBAL_LIST_EMPTY(undershirt_f) //stores only undershirt name
|
||||
//Socks
|
||||
GLOBAL_LIST_EMPTY_TYPED(socks_list, /datum/sprite_accessory/underwear/socks) //stores socks indexed by name
|
||||
//Lizard Bits (all datum lists indexed by name)
|
||||
GLOBAL_LIST_EMPTY(body_markings_list)
|
||||
GLOBAL_LIST_EMPTY(tails_list_lizard)
|
||||
GLOBAL_LIST_EMPTY(animated_tails_list_lizard)
|
||||
GLOBAL_LIST_EMPTY(snouts_list)
|
||||
@@ -55,7 +54,6 @@ GLOBAL_LIST_INIT(mutant_reference_list, list(
|
||||
"frills" = GLOB.frills_list,
|
||||
"horns" = GLOB.horns_list,
|
||||
"ears" = GLOB.ears_list,
|
||||
"body_markings" = GLOB.body_markings_list,
|
||||
"wings" = GLOB.wings_list,
|
||||
"wingsopen" = GLOB.wings_open_list,
|
||||
"deco_wings" = GLOB.deco_wings_list,
|
||||
@@ -299,7 +297,7 @@ GLOBAL_LIST_INIT(roundstart_languages, get_roundstart_languages())
|
||||
//locked parts are those that your picked species requires to have
|
||||
//unlocked parts are those that anyone can choose on customisation regardless
|
||||
//parts not in unlocked, but in all, are thus locked
|
||||
GLOBAL_LIST_INIT(all_mutant_parts, list("tail_lizard" = "Tail", "mam_tail" = "Tail", "tail_human" = "Tail", "snout" = "Snout", "frills" = "Frills", "spines" = "Spines", "body_markings" = "Body Markings", "mam_body_markings" = "Species Markings" , "mam_ears" = "Ears", "ears" = "Ears", "mam_snouts" = "Snout", "legs" = "Legs", "deco_wings" = "Decorative Wings", "insect_wings" = "Insect Wings", "insect_fluff" = "Insect Fluff", "taur" = "Tauric Body", "insect_markings" = "Insect Markings", "wings" = "Wings", "arachnid_legs" = "Arachnid Legs", "arachnid_spinneret" = "Spinneret", "arachnid_mandibles" = "Mandibles", "xenohead" = "Caste Head", "xenotail" = "Tail", "xenodorsal" = "Dorsal Spines", "ipc_screen" = "Screen", "ipc_antenna" = "Antenna", "meat_type" = "Meat Type", "horns" = "Horns"))
|
||||
GLOBAL_LIST_INIT(all_mutant_parts, list("tail_lizard" = "Tail", "mam_tail" = "Tail", "tail_human" = "Tail", "snout" = "Snout", "frills" = "Frills", "spines" = "Spines", "mam_body_markings" = "Species Markings" , "mam_ears" = "Ears", "ears" = "Ears", "mam_snouts" = "Snout", "legs" = "Legs", "deco_wings" = "Decorative Wings", "insect_wings" = "Insect Wings", "insect_fluff" = "Insect Fluff", "taur" = "Tauric Body", "insect_markings" = "Insect Markings", "wings" = "Wings", "arachnid_legs" = "Arachnid Legs", "arachnid_spinneret" = "Spinneret", "arachnid_mandibles" = "Mandibles", "xenohead" = "Caste Head", "xenotail" = "Tail", "xenodorsal" = "Dorsal Spines", "ipc_screen" = "Screen", "ipc_antenna" = "Antenna", "meat_type" = "Meat Type", "horns" = "Horns"))
|
||||
GLOBAL_LIST_INIT(unlocked_mutant_parts, list("horns", "insect_fluff"))
|
||||
|
||||
//parts in either of the above two lists that require a second option that allows them to be coloured
|
||||
@@ -350,3 +348,8 @@ GLOBAL_LIST_INIT(nongendered_limb_types, list("fly", "zombie" ,"synth", "shadow"
|
||||
|
||||
//list of eye types, corresponding to a respective left and right icon state for the set of eyes
|
||||
GLOBAL_LIST_INIT(eye_types, list("normal", "insect", "moth", "double", "double2", "double3", "cyclops"))
|
||||
|
||||
//list linking bodypart bitflags to their actual names
|
||||
GLOBAL_LIST_INIT(bodypart_names, list(num2text(HEAD) = "Head", num2text(CHEST) = "Chest", num2text(LEG_LEFT) = "Left Leg", num2text(LEG_RIGHT) = "Right Leg", num2text(ARM_LEFT) = "Left Arm", num2text(ARM_RIGHT) = "Right Arm"))
|
||||
// list linking bodypart names back to the bitflags
|
||||
GLOBAL_LIST_INIT(bodypart_values, list("Head" = num2text(HEAD), "Chest" = num2text(CHEST), "Left Leg" = num2text(LEG_LEFT), "Right Leg" = num2text(LEG_RIGHT), "Left Arm" = num2text(ARM_LEFT), "Right Arm" = num2text(ARM_RIGHT)))
|
||||
|
||||
@@ -89,6 +89,7 @@
|
||||
//Generic living
|
||||
#define ui_living_pull "EAST-1:28,CENTER-2:15"
|
||||
#define ui_living_health "EAST-1:28,CENTER:15"
|
||||
#define ui_living_healthdoll "EAST-1:28,CENTER-1:15"
|
||||
|
||||
//Monkeys
|
||||
#define ui_monkey_head "CENTER-5:13,SOUTH:5"
|
||||
|
||||
@@ -13,7 +13,6 @@ GLOBAL_LIST_EMPTY(radial_menus)
|
||||
icon_state = "radial_slice"
|
||||
var/choice
|
||||
var/next_page = FALSE
|
||||
var/tooltips = FALSE
|
||||
|
||||
/obj/screen/radial/slice/MouseEntered(location, control, params)
|
||||
. = ..()
|
||||
|
||||
@@ -637,6 +637,11 @@
|
||||
name = "health doll"
|
||||
screen_loc = ui_healthdoll
|
||||
|
||||
/obj/screen/healthdoll/living
|
||||
icon_state = "fullhealth0"
|
||||
screen_loc = ui_living_healthdoll
|
||||
var/filtered = FALSE //so we don't repeatedly create the mask of the mob every update
|
||||
|
||||
/obj/screen/mood
|
||||
name = "mood"
|
||||
icon_state = "mood5"
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
/datum/hud/living/simple_animal
|
||||
ui_style = 'icons/mob/screen_gen.dmi'
|
||||
/datum/hud/living/simple_animal/New(mob/living/owner)
|
||||
..()
|
||||
pull_icon = new /obj/screen/pull()
|
||||
pull_icon.icon = ui_style
|
||||
pull_icon.update_icon()
|
||||
pull_icon.screen_loc = ui_living_pull
|
||||
pull_icon.hud = src
|
||||
static_inventory += pull_icon
|
||||
|
||||
//mob health doll! assumes whatever sprite the mob is
|
||||
healthdoll = new /obj/screen/healthdoll/living()
|
||||
healthdoll.hud = src
|
||||
infodisplay += healthdoll
|
||||
@@ -0,0 +1,23 @@
|
||||
SUBSYSTEM_DEF(explosions)
|
||||
name = "Explosions"
|
||||
wait = 1
|
||||
flags = SS_TICKER
|
||||
priority = FIRE_PRIORITY_EXPLOSIONS
|
||||
var/static/list/datum/wave_explosion/wave_explosions = list()
|
||||
var/static/list/datum/wave_explosion/active_wave_explosions = list()
|
||||
var/static/list/datum/wave_explosion/currentrun = list()
|
||||
|
||||
/datum/controller/subsystem/explosions/fire(resumed)
|
||||
if(!resumed)
|
||||
currentrun = active_wave_explosions.Copy()
|
||||
var/datum/wave_explosion/E
|
||||
var/ran = 0
|
||||
while(length(currentrun) && !MC_TICK_CHECK)
|
||||
ran = 0
|
||||
for(var/i in currentrun)
|
||||
E = i
|
||||
if(E.tick())
|
||||
currentrun -= E
|
||||
ran++
|
||||
if(!ran)
|
||||
break
|
||||
@@ -713,7 +713,8 @@ SUBSYSTEM_DEF(ticker)
|
||||
'sound/roundend/disappointed.ogg',
|
||||
'sound/roundend/gondolabridge.ogg',
|
||||
'sound/roundend/haveabeautifultime.ogg',
|
||||
'sound/roundend/CitadelStationHasSeenBetterDays.ogg'\
|
||||
'sound/roundend/CitadelStationHasSeenBetterDays.ogg',
|
||||
'sound/roundend/approachingbaystation.ogg'\
|
||||
)
|
||||
|
||||
SEND_SOUND(world, sound(round_end_sound))
|
||||
|
||||
@@ -52,8 +52,15 @@
|
||||
return
|
||||
strength -= strength / hl3_release_date
|
||||
if(strength <= RAD_BACKGROUND_RADIATION)
|
||||
qdel(src)
|
||||
addtimer(CALLBACK(src, .proc/check_dissipate), 5 SECONDS)
|
||||
return PROCESS_KILL
|
||||
|
||||
/datum/component/radioactive/proc/check_dissipate()
|
||||
if(strength <= RAD_BACKGROUND_RADIATION)
|
||||
qdel(src)
|
||||
return
|
||||
if(!(datum_flags & DF_ISPROCESSING)) // keep going
|
||||
START_PROCESSING(SSradiation, src)
|
||||
|
||||
/datum/component/radioactive/proc/glow_loop(atom/movable/master)
|
||||
var/filter = master.get_filter("rad_glow")
|
||||
|
||||
@@ -57,7 +57,7 @@
|
||||
/obj/item/reagent_containers/hypospray/medipen, /obj/item/reagent_containers/dropper,
|
||||
/obj/item/implanter, /obj/item/screwdriver, /obj/item/weldingtool/mini,
|
||||
/obj/item/firing_pin, /obj/item/gun/ballistic/automatic/pistol, /obj/item/gun/ballistic/automatic/magrifle/pistol,
|
||||
/obj/item/toy/plush/snakeplushie, /obj/item/gun/energy/e_gun/mini
|
||||
/obj/item/toy/plush/snakeplushie, /obj/item/gun/energy/e_gun/mini, /obj/item/gun/ballistic/derringer
|
||||
))
|
||||
|
||||
/datum/component/storage/concrete/pockets/shoes/clown/Initialize()
|
||||
|
||||
@@ -0,0 +1,378 @@
|
||||
/// Creates a wave explosion at a certain place
|
||||
/proc/wave_explosion(turf/target, power, factor = EXPLOSION_DEFAULT_FALLOFF_MULTIPLY, constant = EXPLOSION_DEFAULT_FALLOFF_SUBTRACT, flash = 0, fire = 0, atom/source, speed = 0,
|
||||
silent = FALSE, bypass_logging = FALSE, block_resistance = 1, start_immediately = TRUE)
|
||||
if(!istype(target) || (power <= EXPLOSION_POWER_DEAD))
|
||||
return
|
||||
if(!bypass_logging)
|
||||
var/logstring = "Wave explosion at [COORD(target)]: [power]/[factor]/[constant]/[flash]/[fire]/[speed] initial/factor/constant/flash/fire/speed"
|
||||
log_game(logstring)
|
||||
message_admins(logstring)
|
||||
return new /datum/wave_explosion(target, power, factor, constant, flash, fire, source, speed, silent, start_immediately, block_resistance)
|
||||
|
||||
/**
|
||||
* New force-blastwave explosion system
|
||||
*/
|
||||
/datum/wave_explosion
|
||||
/// Next unique numerical ID
|
||||
var/static/next_id = 0
|
||||
/// Our unique nuumerical ID
|
||||
var/id
|
||||
/// world.time we started at
|
||||
var/start_time
|
||||
/// Are we currently running?
|
||||
var/running = FALSE
|
||||
/// Are we currently finished?
|
||||
var/finished = FALSE
|
||||
/// What atom we originated from, if any
|
||||
var/atom/source
|
||||
|
||||
/// Explosion power at which point to consider to be a dead expansion
|
||||
var/power_considered_dead = EXPLOSION_POWER_DEAD
|
||||
/// Explosion power we were initially at
|
||||
var/power_initial
|
||||
/// Base explosion power falloff multiplier (applied first)
|
||||
var/power_falloff_factor = EXPLOSION_DEFAULT_FALLOFF_MULTIPLY
|
||||
/// Base explosion power falloff subtract (applied second)
|
||||
var/power_falloff_constant = EXPLOSION_DEFAULT_FALLOFF_SUBTRACT
|
||||
/// Flash range
|
||||
var/flash_range = 0
|
||||
/// Fire probability per tile
|
||||
var/fire_probability = 0
|
||||
/// Are we silent/do we make the screenshake/sounds?
|
||||
var/silent = FALSE
|
||||
|
||||
// Modifications
|
||||
/// Object damage mod
|
||||
var/object_damage_mod = 1
|
||||
/// Hard obstcales get this mod INSTEAD of object damage mod
|
||||
var/hard_obstacle_mod = 1
|
||||
/// Window shatter mod. Overrides both [hard_obstcale_mod] and [object_damage_mod]
|
||||
var/window_shatter_mod = 1
|
||||
/// Wall destruction mod
|
||||
var/wall_destroy_mod = 1
|
||||
/// Mob damage mod
|
||||
var/mob_damage_mod = 1
|
||||
/// Mob gib mod
|
||||
var/mob_gib_mod = 1
|
||||
/// Mob deafen mod
|
||||
var/mob_deafen_mod = 1
|
||||
/// block = block / this, if 0 any block is absolute
|
||||
var/block_resistance = 1
|
||||
|
||||
// Rewrite count: 2
|
||||
// Each cycle is a "perfect ring".
|
||||
// We run into the problem that diagonal hitboxes don't exist on 2d grid games.
|
||||
// How we deal with this is this:
|
||||
// The first half of each cycle explodes cardinal directions awaiting expansion first
|
||||
// Diagonals get added to a potential diagonals list.
|
||||
// The second half of each cycle checks the potential diagonals list. If something isn't on the exploded list,
|
||||
// we know it's a valid diagonal and explode it.
|
||||
// Then all exploded turfs are flushed to exploded_last and it continues.
|
||||
// Direction bitflags use the WEX_DIR_X flags so we can keep track of more than one direction in a single field
|
||||
// The insanity begins when I realized that doing cardinals are easy but diagonals require:
|
||||
// - Tallying the explosive power that should go into it
|
||||
// - Exploding it afterwards using the tallied power rather than passed power (so corners aren't far weaker unless there's one side of it blocked)
|
||||
// Expanding the explosion power of the now exploded diagonal into the two dirs its cardinals are in
|
||||
// If this is done using a perfect algorithm it should be relatively efficient and result in a near-perfect shockwave simulation.
|
||||
|
||||
/// The last ring that's been exploded. Any turfs in this will completely ignore the current cycle. Turf = TRUE
|
||||
var/list/turf/exploded_last = list()
|
||||
/// The "edges" + dirs that need to be processed this cycle. turf = dir flags
|
||||
var/list/turf/edges = list()
|
||||
/// The powers of the current turf edges. turf = power
|
||||
var/list/turf/powers = list()
|
||||
|
||||
/// What cycle are we on?
|
||||
var/cycle
|
||||
/// When we started the current cycle
|
||||
var/cycle_start
|
||||
/// Time to wait between cycles
|
||||
var/cycle_speed = 0
|
||||
/// Current index for list
|
||||
var/index = 1
|
||||
|
||||
/datum/wave_explosion/New(turf/initial, power, factor = EXPLOSION_DEFAULT_FALLOFF_MULTIPLY, constant = EXPLOSION_DEFAULT_FALLOFF_SUBTRACT, flash = 0, fire = 0, atom/source, speed = 0, silent = FALSE, autostart = TRUE, block_resistance = 1)
|
||||
id = ++next_id
|
||||
if(next_id > SHORT_REAL_LIMIT)
|
||||
next_id = 0
|
||||
SSexplosions.wave_explosions += src
|
||||
src.power_initial = power
|
||||
src.power_falloff_factor = factor
|
||||
src.power_falloff_constant = constant
|
||||
src.flash_range = flash
|
||||
src.fire_probability = fire
|
||||
src.source = source
|
||||
src.cycle_speed = speed
|
||||
src.silent = silent
|
||||
src.block_resistance = block_resistance
|
||||
if(!istype(initial))
|
||||
stack_trace("Wave explosion created without a turf. This better be for debugging purposes.")
|
||||
return
|
||||
if(autostart)
|
||||
start(initial)
|
||||
|
||||
/datum/wave_explosion/Destroy()
|
||||
if(running)
|
||||
stop(FALSE)
|
||||
return ..()
|
||||
|
||||
/datum/wave_explosion/proc/start(list/turf/_starting)
|
||||
if(running)
|
||||
CRASH("Attempted to start() a running wave explosion")
|
||||
if(!islist(_starting))
|
||||
_starting = list(_starting)
|
||||
var/list/mob/to_flash = list()
|
||||
var/list/feedback = list()
|
||||
var/list/mob/mob_potential_shake = list()
|
||||
var/list/mob/closest_to = list()
|
||||
for(var/i in 1 to _starting.len)
|
||||
var/turf/starting = _starting[i]
|
||||
edges[starting] = WEX_ALLDIRS
|
||||
powers[starting] = power_initial
|
||||
var/x0 = starting.x
|
||||
var/y0 = starting.y
|
||||
var/z0 = starting.z
|
||||
var/area/areatype = get_area(starting)
|
||||
feedback += list(list("power" = power_initial, factor = "factor", constant = "constant", flash = "flash", fire = "fire", speed = "speed", "x" = x0, "y" = y0, "z" = z0, "area" = areatype.type, "time" = TIME_STAMP("YYYY-MM-DD hh:mm:ss", 1)))
|
||||
// Play sounds; we want sounds to be different depending on distance so we will manually do it ourselves.
|
||||
// Stereo users will also hear the direction of the explosion!
|
||||
|
||||
// Calculate far explosion sound range. Only allow the sound effect for heavy/devastating explosions.
|
||||
// 3/7/14 will calculate to 80 + 35
|
||||
|
||||
if(!silent)
|
||||
for(var/mob/M in GLOB.player_list)
|
||||
// Double check for client
|
||||
var/turf/M_turf = get_turf(M)
|
||||
if(M_turf && M_turf.z == z0)
|
||||
var/dist = get_dist(M_turf, starting)
|
||||
if(isnull(mob_potential_shake[M]))
|
||||
mob_potential_shake[M] = dist
|
||||
closest_to[M] = starting
|
||||
else if(mob_potential_shake[M] < dist)
|
||||
mob_potential_shake[M] = dist
|
||||
closest_to[M] = starting
|
||||
|
||||
for(var/array in GLOB.doppler_arrays)
|
||||
var/obj/machinery/doppler_array/A = array
|
||||
A.sense_wave_explosion(starting, power_initial, cycle_speed)
|
||||
|
||||
// Flash mobs
|
||||
if(flash_range)
|
||||
for(var/mob/living/L in viewers(flash_range, starting))
|
||||
to_flash |= L
|
||||
|
||||
if(!silent)
|
||||
var/frequency = get_rand_frequency()
|
||||
var/sound/explosion_sound = sound(get_sfx("explosion"))
|
||||
var/sound/far_explosion_sound = sound('sound/effects/explosionfar.ogg')
|
||||
|
||||
var/far_dist = sqrt(power_initial) * 7.5
|
||||
|
||||
for(var/mob/M in mob_potential_shake)
|
||||
var/dist = mob_potential_shake[M]
|
||||
var/baseshakeamount
|
||||
if(sqrt(power_initial) - dist > 0)
|
||||
baseshakeamount = sqrt((sqrt(power_initial) - dist)*0.1)
|
||||
// If inside the blast radius + world.view - 2
|
||||
if(dist <= round(2 * sqrt(power_initial) + world.view - 2, 1))
|
||||
M.playsound_local(closest_to[M], null, 100, 1, frequency, max_distance = 5, S = explosion_sound)
|
||||
if(baseshakeamount > 0)
|
||||
shake_camera(M, 25, clamp(baseshakeamount, 0, 10))
|
||||
// You hear a far explosion if you're outside the blast radius. Small bombs shouldn't be heard all over the station.
|
||||
else if(dist <= far_dist)
|
||||
var/far_volume = clamp(far_dist, 30, 50) // Volume is based on explosion size and dist
|
||||
far_volume += (dist <= far_dist * 0.5 ? 50 : 0) // add 50 volume if the mob is pretty close to the explosion
|
||||
M.playsound_local(closest_to[M], null, far_volume, 1, frequency, max_distance = 5, S = far_explosion_sound)
|
||||
if(baseshakeamount > 0)
|
||||
shake_camera(M, 10, clamp(baseshakeamount*0.25, 0, 2.5))
|
||||
|
||||
for(var/i in 1 to to_flash.len)
|
||||
var/mob/living/L = to_flash[i]
|
||||
L.flash_act()
|
||||
|
||||
SSblackbox.record_feedback("associative", "wave_explosion", 1, feedback)
|
||||
|
||||
if(!cycle)
|
||||
cycle = 1
|
||||
SSexplosions.active_wave_explosions += src
|
||||
running = TRUE
|
||||
cycle_start = world.time - cycle_speed
|
||||
tick()
|
||||
|
||||
/datum/wave_explosion/proc/stop(delete = TRUE)
|
||||
SSexplosions.active_wave_explosions -= src
|
||||
SSexplosions.currentrun -= src
|
||||
edges = null
|
||||
powers = null
|
||||
exploded_last = null
|
||||
cycle = null
|
||||
running = FALSE
|
||||
qdel(src)
|
||||
|
||||
#define SHOULD_SUSPEND ((cycle_start + cycle_speed) > world.time)
|
||||
|
||||
/**
|
||||
* Called by SSexplosions to propagate this.
|
||||
* Return TRUE if postponed
|
||||
*/
|
||||
/datum/wave_explosion/proc/tick()
|
||||
/// Each tick goes through one full cycle.
|
||||
// This can be changed to a "continuous process" system where indexes are tracked if needed.
|
||||
if(!src.edges.len)
|
||||
// we're done
|
||||
finished = TRUE
|
||||
stop(TRUE)
|
||||
return TRUE
|
||||
if(SHOULD_SUSPEND)
|
||||
return TRUE
|
||||
// Set up variables
|
||||
var/turf/T
|
||||
var/turf/expanding
|
||||
var/power
|
||||
var/returned
|
||||
var/blocked
|
||||
var/dir
|
||||
// insanity define to explode a turf with a certain amount of power, direction, and set returned.
|
||||
#define WEX_ACT(_T, _P, _D) \
|
||||
returned = max(0, _T.wave_explode(_P, src, _D)); \
|
||||
blocked = _P - returned; \
|
||||
if(!block_resistance) { \
|
||||
if(blocked > EXPLOSION_POWER_NO_RESIST_THRESHOLD) { \
|
||||
returned = 0; \
|
||||
} \
|
||||
} \
|
||||
else if(blocked) { \
|
||||
returned = _P - (blocked / block_resistance); \
|
||||
}; \
|
||||
returned = round((returned * power_falloff_factor) - power_falloff_constant, EXPLOSION_POWER_QUANTIZATION_ACCURACY); \
|
||||
if(prob(fire_probability)) { \
|
||||
new /obj/effect/hotspot(_T); \
|
||||
};
|
||||
|
||||
// Cache hot lists
|
||||
var/list/turf/edges = src.edges
|
||||
var/list/turf/powers = src.powers
|
||||
var/list/turf/exploded_last = src.exploded_last
|
||||
|
||||
// prepare expansions
|
||||
var/list/turf/edges_next = list()
|
||||
var/list/turf/powers_next = list()
|
||||
var/list/turf/powers_returned = list()
|
||||
var/list/turf/diagonals = list()
|
||||
var/list/turf/diagonal_powers = list()
|
||||
var/list/turf/diagonal_powers_max = list()
|
||||
|
||||
// to_chat(world, "DEBUG: cycle start edges [english_list_assoc(edges)]")
|
||||
|
||||
// Process cardinals:
|
||||
// Explode all cardinals and expand in directions, gathering all cardinals it should go to.
|
||||
// Power for when things meet in the middle should be the greatest of the two.
|
||||
for(var/i in edges)
|
||||
T = i
|
||||
power = powers[T]
|
||||
dir = edges[T]
|
||||
WEX_ACT(T, power, dir)
|
||||
if(returned < power_considered_dead)
|
||||
continue
|
||||
powers_returned[T] = returned
|
||||
// diagonal power calc when multiple things hit one diagonal
|
||||
#define CALCULATE_DIAGONAL_POWER(existing, adding, maximum) min(maximum, existing + adding)
|
||||
// diagonal hitting cardinal expansion
|
||||
#define CALCULATE_DIAGONAL_CROSS_POWER(existing, adding) max(existing, adding)
|
||||
// insanity define to mark the next set of cardinals.
|
||||
#define CARDINAL_MARK(ndir, cdir, edir) \
|
||||
if(edir & cdir) { \
|
||||
CARDINAL_MARK_NOCHECK(ndir, cdir, edir); \
|
||||
};
|
||||
|
||||
#define CARDINAL_MARK_NOCHECK(ndir, cdir, edir) \
|
||||
expanding = get_step(T,ndir); \
|
||||
if(expanding && !exploded_last[expanding] && !edges[expanding]) { \
|
||||
powers_next[expanding] = max(powers_next[expanding], returned); \
|
||||
edges_next[expanding] = (cdir | edges_next[expanding]); \
|
||||
};
|
||||
|
||||
// insanity define to do diagonal marking as 2 substeps
|
||||
#define DIAGONAL_SUBSTEP(ndir, cdir, edir) \
|
||||
expanding = get_step(T,ndir); \
|
||||
if(expanding && !exploded_last[expanding] && !edges[expanding]) { \
|
||||
if(!edges_next[expanding]) { \
|
||||
diagonal_powers_max[expanding] = max(diagonal_powers_max[expanding], returned, powers[T]); \
|
||||
diagonal_powers[expanding] = CALCULATE_DIAGONAL_POWER(diagonal_powers[expanding], returned, diagonal_powers_max[expanding]); \
|
||||
diagonals[expanding] = (cdir | diagonals[expanding]); \
|
||||
}; \
|
||||
else { \
|
||||
powers_next[expanding] = CALCULATE_DIAGONAL_CROSS_POWER(powers_next[expanding], returned); \
|
||||
}; \
|
||||
};
|
||||
|
||||
// insanity define to mark the diagonals that would otherwise be missed
|
||||
#define DIAGONAL_MARK(ndir, cdir, edir) \
|
||||
if(edir & cdir) { \
|
||||
DIAGONAL_MARK_NOCHECK(ndir, cdir, edir); \
|
||||
};
|
||||
|
||||
// this only works because right now, WEX_DIR_X is the same as a byond dir
|
||||
// and we know we're only passing in one dir at a time.
|
||||
// if this ever stops being the case, and explosions break when you touch this, now you know why.
|
||||
#define DIAGONAL_MARK_NOCHECK(ndir, cdir, edir) \
|
||||
DIAGONAL_SUBSTEP(turn(ndir, 90), turn(cdir, 90), edir); \
|
||||
DIAGONAL_SUBSTEP(turn(ndir, -90), turn(cdir, -90), edir);
|
||||
|
||||
// mark
|
||||
#define MARK(ndir, cdir, edir) \
|
||||
if(edir & cdir) { \
|
||||
CARDINAL_MARK_NOCHECK(ndir, cdir, edir); \
|
||||
DIAGONAL_MARK_NOCHECK(ndir, cdir, edir); \
|
||||
};
|
||||
CARDINAL_MARK(NORTH, WEX_DIR_NORTH, dir)
|
||||
CARDINAL_MARK(SOUTH, WEX_DIR_SOUTH, dir)
|
||||
CARDINAL_MARK(EAST, WEX_DIR_EAST, dir)
|
||||
CARDINAL_MARK(WEST, WEX_DIR_WEST, dir)
|
||||
|
||||
// to_chat(world, "DEBUG: cycle mid edges_next [english_list_assoc(edges_next)]")
|
||||
|
||||
// Sweep after cardinals for diagonals
|
||||
for(var/i in edges)
|
||||
T = i
|
||||
power = powers[T]
|
||||
dir = edges[T]
|
||||
returned = powers_returned[T]
|
||||
DIAGONAL_MARK(NORTH, WEX_DIR_NORTH, dir)
|
||||
DIAGONAL_MARK(SOUTH, WEX_DIR_SOUTH, dir)
|
||||
DIAGONAL_MARK(EAST, WEX_DIR_EAST, dir)
|
||||
DIAGONAL_MARK(WEST, WEX_DIR_WEST, dir)
|
||||
|
||||
// to_chat(world, "DEBUG: cycle mid diagonals [english_list_assoc(diagonals)]")
|
||||
|
||||
// Process diagonals:
|
||||
for(var/i in diagonals)
|
||||
T = i
|
||||
power = diagonal_powers[T]
|
||||
dir = diagonals[T]
|
||||
WEX_ACT(T, power, dir)
|
||||
if(returned < power_considered_dead)
|
||||
continue
|
||||
CARDINAL_MARK(NORTH, WEX_DIR_NORTH, dir)
|
||||
CARDINAL_MARK(SOUTH, WEX_DIR_SOUTH, dir)
|
||||
CARDINAL_MARK(EAST, WEX_DIR_EAST, dir)
|
||||
CARDINAL_MARK(WEST, WEX_DIR_WEST, dir)
|
||||
|
||||
// to_chat(world, "DEBUG: cycle end edges_next [english_list_assoc(edges_next)]")
|
||||
|
||||
// flush lists
|
||||
src.exploded_last = edges + diagonals
|
||||
src.edges = edges_next
|
||||
src.powers = powers_next
|
||||
cycle++
|
||||
cycle_start = world.time
|
||||
|
||||
#undef SHOULD_SUSPEND
|
||||
|
||||
#undef WEX_ACT
|
||||
|
||||
#undef DIAGONAL_SUBSTEP
|
||||
#undef DIAGONAL_MARK
|
||||
#undef CARDINAL_MARK
|
||||
#undef MARK
|
||||
@@ -142,7 +142,8 @@
|
||||
// Can most things breathe?
|
||||
if(trace_gases)
|
||||
continue
|
||||
if(A.get_moles(/datum/gas/oxygen) >= 16)
|
||||
var/oxy_moles = A.get_moles(/datum/gas/oxygen)
|
||||
if(oxy_moles < 16 || oxy_moles > 50)
|
||||
continue
|
||||
if(A.get_moles(/datum/gas/plasma))
|
||||
continue
|
||||
|
||||
+36
-1
@@ -36,6 +36,14 @@
|
||||
///Value used to increment ex_act() if reactionary_explosions is on
|
||||
var/explosion_block = 0
|
||||
|
||||
/// Flags for explosions
|
||||
var/explosion_flags = NONE
|
||||
/// Amount to decrease wave explosions by
|
||||
var/wave_explosion_block = 0
|
||||
/// Amount to multiply wave explosions by
|
||||
var/wave_explosion_multiply = 1
|
||||
|
||||
//its inherent color, the colored paint applied on it, special color effect etc...
|
||||
/**
|
||||
* used to store the different colors on an atom
|
||||
*
|
||||
@@ -43,7 +51,6 @@
|
||||
*/
|
||||
var/list/atom_colours
|
||||
|
||||
|
||||
/// a very temporary list of overlays to remove
|
||||
var/list/remove_overlays
|
||||
/// a very temporary list of overlays to add
|
||||
@@ -556,6 +563,34 @@
|
||||
contents_explosion(severity, target)
|
||||
SEND_SIGNAL(src, COMSIG_ATOM_EX_ACT, severity, target)
|
||||
|
||||
/**
|
||||
* Called when a wave explosion hits this atom. Do not override this.
|
||||
*
|
||||
* Returns explosion power to "allow through".
|
||||
*/
|
||||
/atom/proc/wave_explode(power, datum/wave_explosion/explosion, dir)
|
||||
set waitfor = FALSE
|
||||
// SHOULD_NOT_SLEEP(TRUE)
|
||||
SHOULD_NOT_OVERRIDE(TRUE)
|
||||
SEND_SIGNAL(src, COMSIG_ATOM_WAVE_EX_ACT, args)
|
||||
. = wave_ex_act(power, explosion, dir) // this must happen first for stuff like destruction/damage to tick.
|
||||
if(isnull(.))
|
||||
stack_trace("wave_ex_act on [type] failed to return a number. defaulting to no blocking.")
|
||||
return power
|
||||
if((explosion_flags & EXPLOSION_FLAG_DENSITY_DEPENDENT) && !density)
|
||||
return power // no block
|
||||
else if((explosion_flags & EXPLOSION_FLAG_HARD_OBSTACLE) && !QDELETED(src))
|
||||
return 0 // fully blocked
|
||||
|
||||
/**
|
||||
* Called when a wave explosion hits this atom.
|
||||
*
|
||||
* Returns explosion power to "allow through". Standard handling and flag overrides in [wave_explode()].
|
||||
*/
|
||||
/atom/proc/wave_ex_act(power, datum/wave_explosion/explosion, dir)
|
||||
// SHOULD_NOT_SLEEP(TRUE)
|
||||
return power * wave_explosion_multiply - wave_explosion_block
|
||||
|
||||
/atom/proc/blob_act(obj/structure/blob/B)
|
||||
SEND_SIGNAL(src, COMSIG_ATOM_BLOB_ACT, B)
|
||||
return
|
||||
|
||||
@@ -55,6 +55,9 @@
|
||||
///Internal holder for emissive blocker object, do not use directly use blocks_emissive
|
||||
var/atom/movable/emissive_blocker/em_block
|
||||
|
||||
/// Should we use tooltips, if the thing does not have the code implemented `get_tooltip_data()`, it will default to examine(src)
|
||||
var/tooltips = FALSE
|
||||
|
||||
|
||||
/atom/movable/Initialize(mapload)
|
||||
. = ..()
|
||||
|
||||
@@ -96,6 +96,10 @@ Class Procs:
|
||||
flags_ricochet = RICOCHET_HARD
|
||||
ricochet_chance_mod = 0.3
|
||||
|
||||
explosion_flags = EXPLOSION_FLAG_DENSITY_DEPENDENT
|
||||
wave_explosion_block = EXPLOSION_BLOCK_MACHINE
|
||||
wave_explosion_multiply = EXPLOSION_DAMPEN_MACHINE
|
||||
|
||||
anchored = TRUE
|
||||
interaction_flags_atom = INTERACT_ATOM_ATTACK_HAND | INTERACT_ATOM_UI_INTERACT
|
||||
|
||||
|
||||
@@ -79,10 +79,12 @@
|
||||
if (obj_flags & EMAGGED)
|
||||
return
|
||||
obj_flags |= EMAGGED
|
||||
SSshuttle.shuttle_purchase_requirements_met |= "emagged"
|
||||
if (authenticated)
|
||||
authorize_access = get_all_accesses()
|
||||
to_chat(user, "<span class='danger'>You scramble the communication routing circuits!</span>")
|
||||
playsound(src, 'sound/machines/terminal_alert.ogg', 50, FALSE)
|
||||
SSshuttle.shuttle_purchase_requirements_met["emagged"] = TRUE
|
||||
return
|
||||
|
||||
/obj/machinery/computer/communications/ui_act(action, list/params)
|
||||
|
||||
@@ -54,6 +54,8 @@
|
||||
assemblytype = /obj/structure/door_assembly
|
||||
normalspeed = 1
|
||||
explosion_block = 1
|
||||
wave_explosion_block = EXPLOSION_BLOCK_WALL
|
||||
wave_explosion_multiply = EXPLOSION_DAMPEN_WALL
|
||||
hud_possible = list(DIAG_AIRLOCK_HUD)
|
||||
|
||||
interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON | INTERACT_MACHINE_REQUIRES_SILICON | INTERACT_MACHINE_OPEN
|
||||
|
||||
@@ -16,6 +16,11 @@
|
||||
|
||||
interaction_flags_atom = INTERACT_ATOM_UI_INTERACT
|
||||
|
||||
wave_explosion_block = EXPLOSION_BLOCK_DENSE_FILLER
|
||||
wave_explosion_multiply = EXPLOSION_DAMPEN_DENSE_FILLER
|
||||
|
||||
explosion_flags = EXPLOSION_FLAG_HARD_OBSTACLE | EXPLOSION_FLAG_DENSITY_DEPENDENT
|
||||
|
||||
var/secondsElectrified = 0
|
||||
var/air_tight = FALSE //TRUE means density will be set as soon as the door begins to close
|
||||
var/shockedby
|
||||
@@ -412,3 +417,8 @@
|
||||
|
||||
/obj/machinery/door/GetExplosionBlock()
|
||||
return density ? real_explosion_block : 0
|
||||
|
||||
/obj/machinery/door/wave_explosion_damage(power, datum/wave_explosion/explosion)
|
||||
. = ..()
|
||||
if(!density)
|
||||
return . * EXPLOSION_DAMAGE_OPEN_DOOR_FACTOR
|
||||
|
||||
@@ -71,3 +71,6 @@
|
||||
|
||||
/obj/machinery/door/password/ex_act(severity, target)
|
||||
return
|
||||
|
||||
/obj/machinery/door/password/wave_ex_act(power, datum/wave_explosion/explosion, dir)
|
||||
return 0 //no.
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
closingLayer = CLOSED_BLASTDOOR_LAYER
|
||||
sub_door = TRUE
|
||||
explosion_block = 3
|
||||
wave_explosion_block = EXPLOSION_BLOCK_BLAST_PROOF
|
||||
wave_explosion_multiply = EXPLOSION_DAMPEN_BLAST_PROOF
|
||||
heat_proof = TRUE
|
||||
safe = FALSE
|
||||
max_integrity = 600
|
||||
|
||||
@@ -360,6 +360,8 @@
|
||||
max_integrity = 300 //Stronger doors for prison (regular window door health is 200)
|
||||
reinf = 1
|
||||
explosion_block = 1
|
||||
wave_explosion_block = EXPLOSION_BLOCK_REINFORCED_WINDOW
|
||||
wave_explosion_multiply = EXPLOSION_DAMPEN_REINFORCED_WINDOW
|
||||
|
||||
/obj/machinery/door/window/brigdoor/security/cell
|
||||
name = "cell door"
|
||||
|
||||
@@ -114,6 +114,44 @@ GLOBAL_LIST_EMPTY(doppler_arrays)
|
||||
LAZYADD(message_log, messages.Join(" "))
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/doppler_array/proc/sense_wave_explosion(turf/epicenter, power, speed)
|
||||
if(stat & NOPOWER)
|
||||
return FALSE
|
||||
var/turf/zone = get_turf(src)
|
||||
if(zone.z != epicenter.z)
|
||||
return FALSE
|
||||
|
||||
if(next_announce > world.time)
|
||||
return FALSE
|
||||
next_announce = world.time + cooldown
|
||||
|
||||
var/distance = get_dist(epicenter, zone)
|
||||
var/direct = get_dir(zone, epicenter)
|
||||
|
||||
if(distance > max_dist)
|
||||
return FALSE
|
||||
if(!(direct & dir) && !integrated)
|
||||
return FALSE
|
||||
|
||||
|
||||
var/list/messages = list("Explosive shockwave detected.", \
|
||||
"Epicenter at: grid ([epicenter.x],[epicenter.y]). Shockwave expanding at a theoretical speed of [speed] m/s.", \
|
||||
"Wave energy: [power]MJ.")
|
||||
|
||||
if(integrated)
|
||||
var/obj/item/clothing/head/helmet/space/hardsuit/helm = loc
|
||||
if(!helm || !istype(helm, /obj/item/clothing/head/helmet/space/hardsuit))
|
||||
return FALSE
|
||||
helm.display_visor_message("Waveform explosion detected! Wave energy: [power]MJ.")
|
||||
else
|
||||
for(var/message in messages)
|
||||
say(message)
|
||||
if(LAZYLEN(message_log) > list_limit)
|
||||
say("Storage buffer is full! Clearing buffers...")
|
||||
LAZYCLEARLIST(message_log)
|
||||
LAZYADD(message_log, messages.Join(" "))
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/doppler_array/examine(mob/user)
|
||||
. = ..()
|
||||
. += "<span class='notice'>Its dish is facing to the [dir2text(dir)].</span>"
|
||||
|
||||
@@ -50,6 +50,10 @@
|
||||
/obj/effect/decal/cleanable/glass/ex_act()
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/decal/cleanable/glass/wave_ex_act(power, datum/wave_explosion/explosion, dir)
|
||||
qdel(src)
|
||||
return power
|
||||
|
||||
/obj/effect/decal/cleanable/glass/plasma
|
||||
icon_state = "plasmatiny"
|
||||
|
||||
@@ -131,6 +135,9 @@
|
||||
/obj/effect/decal/cleanable/greenglow/ex_act()
|
||||
return
|
||||
|
||||
/obj/effect/decal/cleanable/greenglow/wave_ex_act(power, datum/wave_explosion/explosion, dir)
|
||||
return power
|
||||
|
||||
/obj/effect/decal/cleanable/cobweb
|
||||
name = "cobweb"
|
||||
desc = "Somebody should remove that."
|
||||
@@ -253,6 +260,11 @@
|
||||
if(severity == 1) //so shreds created during an explosion aren't deleted by the explosion.
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/decal/cleanable/shreds/wave_ex_act(power, datum/wave_explosion/explosion, dir)
|
||||
if(power > EXPLOSION_POWER_ERASE_SHREDS)
|
||||
qdel(src)
|
||||
return power // no block
|
||||
|
||||
/obj/effect/decal/cleanable/shreds/Initialize()
|
||||
pixel_x = rand(-10, 10)
|
||||
pixel_y = rand(-10, 10)
|
||||
|
||||
@@ -309,6 +309,10 @@
|
||||
|
||||
/obj/structure/foamedmetal/resin/Initialize()
|
||||
. = ..()
|
||||
neutralize_air()
|
||||
addtimer(CALLBACK(src, .proc/neutralize_air), 5) // yeah this sucks, maybe when auxmos is out
|
||||
|
||||
/obj/structure/foamedmetal/resin/proc/neutralize_air()
|
||||
if(isopenturf(loc))
|
||||
var/turf/open/O = loc
|
||||
O.ClearWet()
|
||||
|
||||
@@ -248,6 +248,14 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
|
||||
loc = null
|
||||
loc = T
|
||||
|
||||
/obj/item/wave_ex_act(power, datum/wave_explosion/explosion, dir)
|
||||
. = ..()
|
||||
if(!anchored)
|
||||
var/throw_dist = round(rand(3, max(3, 2.5 * sqrt(power))), 1)
|
||||
throw_speed = EXPLOSION_THROW_SPEED
|
||||
var/turf/target = get_ranged_target_turf(src, dir, throw_dist)
|
||||
throw_at(target, throw_dist, EXPLOSION_THROW_SPEED)
|
||||
|
||||
/obj/item/examine(mob/user) //This might be spammy. Remove?
|
||||
. = ..()
|
||||
|
||||
|
||||
@@ -553,6 +553,9 @@
|
||||
/obj/item/card/id/syndicate/locked_banking
|
||||
bank_support = ID_LOCKED_BANK_ACCOUNT
|
||||
|
||||
/obj/item/card/id/pirate
|
||||
access = list(ACCESS_SYNDICATE)
|
||||
|
||||
/obj/item/card/id/captains_spare
|
||||
name = "captain's spare ID"
|
||||
desc = "The spare ID of the High Lord himself."
|
||||
|
||||
@@ -649,6 +649,9 @@
|
||||
pre_noise = TRUE
|
||||
post_noise = FALSE
|
||||
|
||||
var/stun_delay = 0 // how long it takes for you to be able to stun someone with the spraycan again
|
||||
var/last_stun_time = 0
|
||||
|
||||
/obj/item/toy/crayon/spraycan/isValidSurface(surface)
|
||||
return (istype(surface, /turf/open/floor) || istype(surface, /turf/closed/wall))
|
||||
|
||||
@@ -716,7 +719,8 @@
|
||||
if(C.client)
|
||||
C.blur_eyes(3)
|
||||
C.blind_eyes(1)
|
||||
if(C.get_eye_protection() <= 0) // no eye protection? ARGH IT BURNS.
|
||||
if(C.get_eye_protection() <= 0 && (last_stun_time + stun_delay) <= world.time) // no eye protection? ARGH IT BURNS.
|
||||
last_stun_time = world.time
|
||||
C.confused = max(C.confused, 3)
|
||||
C.DefaultCombatKnockdown(60)
|
||||
if(ishuman(C) && actually_paints)
|
||||
@@ -771,6 +775,7 @@
|
||||
name = "cyborg spraycan"
|
||||
desc = "A metallic container containing shiny synthesised paint."
|
||||
charges = -1
|
||||
stun_delay = 5 SECONDS
|
||||
|
||||
/obj/item/toy/crayon/spraycan/borg/draw_on(atom/target,mob/user,proximity, params)
|
||||
var/diff = ..()
|
||||
|
||||
@@ -100,6 +100,42 @@
|
||||
"<span class='suicide'>[user] is slitting [user.p_their()] stomach open with the [src.name]! It looks like [user.p_theyre()] trying to commit seppuku.</span>"))
|
||||
return (BRUTELOSS)
|
||||
|
||||
/obj/item/kitchen/efink
|
||||
name = "E-Fink"
|
||||
icon_state = "efink"
|
||||
desc = "The E-Fink is a product by Mending Solutions Inc. Unfortunately it can only mend sliced meat, fruits and dough back to their original state. Unbutchering is not possible."
|
||||
flags_1 = CONDUCT_1
|
||||
force = 10
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
throwforce = 10
|
||||
hitsound = 'sound/weapons/bladesliceb.ogg'
|
||||
throw_speed = 3
|
||||
throw_range = 6
|
||||
custom_materials = list(/datum/material/iron=12000)
|
||||
attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
||||
sharpness = SHARP_POINTY
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
|
||||
var/bayonet = FALSE //Can this be attached to a gun?
|
||||
wound_bonus = -5
|
||||
bare_wound_bonus = 10
|
||||
custom_price = PRICE_NORMAL
|
||||
|
||||
/obj/item/kitchen/efink/Initialize()
|
||||
. = ..()
|
||||
AddComponent(/datum/component/butchering, 80 - force, 100, force - 10) //bonus chance increases depending on force
|
||||
|
||||
/obj/item/kitchen/efink/attack(mob/living/carbon/M, mob/living/carbon/user)
|
||||
if(user.zone_selected == BODY_ZONE_PRECISE_EYES)
|
||||
return eyestab(M,user)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/kitchen/efink/suicide_act(mob/user)
|
||||
user.visible_message(pick("<span class='suicide'>[user] is slitting [user.p_their()] wrists with the [src.name]! It looks like [user.p_theyre()] trying to commit suicide.</span>", \
|
||||
"<span class='suicide'>[user] is slitting [user.p_their()] throat with the [src.name]! It looks like [user.p_theyre()] trying to commit suicide.</span>", \
|
||||
"<span class='suicide'>[user] is slitting [user.p_their()] stomach open with the [src.name]! It looks like [user.p_theyre()] trying to commit seppuku.</span>"))
|
||||
return (BRUTELOSS)
|
||||
|
||||
/obj/item/kitchen/knife/ritual
|
||||
name = "ritual knife"
|
||||
desc = "The unearthly energies that once powered this blade are now dormant."
|
||||
@@ -248,6 +284,24 @@
|
||||
/obj/item/kitchen/rollingpin/suicide_act(mob/living/carbon/user)
|
||||
user.visible_message("<span class='suicide'>[user] begins flattening [user.p_their()] head with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
return BRUTELOSS
|
||||
|
||||
/obj/item/kitchen/unrollingpin
|
||||
name = "unrolling pin"
|
||||
desc = "For when you accidentally flattened something."
|
||||
icon_state = "unrolling_pin"
|
||||
force = 8
|
||||
throwforce = 5
|
||||
throw_speed = 3
|
||||
throw_range = 7
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
custom_materials = list(/datum/material/wood = MINERAL_MATERIAL_AMOUNT * 1.5)
|
||||
attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked")
|
||||
custom_price = PRICE_ALMOST_CHEAP
|
||||
|
||||
/obj/item/kitchen/unrollingpin/suicide_act(mob/living/carbon/user)
|
||||
user.visible_message("<span class='suicide'>[user] begins unflattening [user.p_their()] head with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
return BRUTELOSS
|
||||
|
||||
/* Trays moved to /obj/item/storage/bag */
|
||||
|
||||
/obj/item/kitchen/knife/scimitar
|
||||
|
||||
@@ -248,6 +248,7 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \
|
||||
null, \
|
||||
new/datum/stack_recipe("rifle stock", /obj/item/weaponcrafting/stock, 10, time = 20), \
|
||||
new/datum/stack_recipe("rolling pin", /obj/item/kitchen/rollingpin, 2, time = 30), \
|
||||
new/datum/stack_recipe("unrolling pin", /obj/item/kitchen/unrollingpin, 2, time = 30), \
|
||||
new/datum/stack_recipe("wooden bucket", /obj/item/reagent_containers/glass/bucket/wood, 2, time = 30), \
|
||||
new/datum/stack_recipe("painting frame", /obj/item/wallframe/painting, 1, time = 10),\
|
||||
new/datum/stack_recipe("wooden buckler", /obj/item/shield/riot/buckler, 20, time = 40), \
|
||||
|
||||
@@ -367,7 +367,7 @@
|
||||
/obj/item/storage/fancy/cigarettes/derringer/AltClick(mob/living/carbon/user)
|
||||
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
|
||||
return
|
||||
var/obj/item/W = (locate(/obj/item/ammo_casing/a357) in contents) || (locate(/obj/item/clothing/mask/cigarette) in contents) || locate(/obj/item/ammo_casing/g4570) //Easy access smokes and bullets
|
||||
var/obj/item/W = (locate(/obj/item/ammo_casing/a357) in contents) || (locate(/obj/item/clothing/mask/cigarette) in contents) ||(locate(/obj/item/gun/ballistic/derringer) in contents) || (locate(/obj/item/ammo_casing/c38) in contents) || locate(/obj/item/ammo_casing/g4570) in contents//Easy access smokes and bullets
|
||||
if(W && contents.len > 0)
|
||||
SEND_SIGNAL(src, COMSIG_TRY_STORAGE_TAKE, W, user)
|
||||
user.put_in_hands(W)
|
||||
@@ -382,6 +382,7 @@
|
||||
new /obj/item/ammo_casing/a357(src)
|
||||
new /obj/item/ammo_casing/a357(src)
|
||||
new /obj/item/ammo_casing/a357(src)
|
||||
new /obj/item/ammo_casing/a357(src)
|
||||
new /obj/item/clothing/mask/cigarette/syndicate(src)
|
||||
|
||||
//For traitors with luck/class
|
||||
@@ -404,6 +405,7 @@
|
||||
new /obj/item/ammo_casing/g4570(src)
|
||||
new /obj/item/ammo_casing/g4570(src)
|
||||
new /obj/item/ammo_casing/g4570(src)
|
||||
new /obj/item/ammo_casing/g4570(src)
|
||||
new /obj/item/clothing/mask/cigarette/xeno(src)
|
||||
|
||||
//For Cargomen, looking for a good deal on arms, with no quarrels as to where they're from.
|
||||
@@ -419,6 +421,7 @@
|
||||
new /obj/item/ammo_casing/c38/lethal(src)
|
||||
new /obj/item/ammo_casing/c38/lethal(src)
|
||||
new /obj/item/ammo_casing/c38/lethal(src)
|
||||
new /obj/item/ammo_casing/c38/lethal(src)
|
||||
new /obj/item/clothing/mask/cigarette/shadyjims (src)
|
||||
/////////////
|
||||
//CIGAR BOX//
|
||||
|
||||
@@ -71,6 +71,19 @@
|
||||
if(3)
|
||||
take_damage(rand(10, 90), BRUTE, "bomb", 0)
|
||||
|
||||
/obj/wave_ex_act(power, datum/wave_explosion/explosion, dir)
|
||||
if(resistance_flags & INDESTRUCTIBLE)
|
||||
return power
|
||||
. = ..()
|
||||
if(explosion.source == src)
|
||||
obj_integrity = 0
|
||||
qdel(src)
|
||||
return
|
||||
take_damage(wave_explosion_damage(power, explosion), BRUTE, "bomb", 0)
|
||||
|
||||
/obj/proc/wave_explosion_damage(power, datum/wave_explosion/explosion)
|
||||
return (explosion_flags & EXPLOSION_FLAG_HARD_OBSTACLE)? EXPLOSION_POWER_STANDARD_SCALE_HARD_OBSTACLE_DAMAGE(power, explosion.hard_obstacle_mod) : EXPLOSION_POWER_STANDARD_SCALE_OBJECT_DAMAGE(power, explosion.object_damage_mod)
|
||||
|
||||
/obj/bullet_act(obj/item/projectile/P)
|
||||
. = ..()
|
||||
playsound(src, P.hitsound, 50, 1)
|
||||
|
||||
@@ -56,6 +56,11 @@
|
||||
name = "gear crate"
|
||||
icon_state = "secgearcrate"
|
||||
|
||||
/obj/structure/closet/crate/secure/soviet
|
||||
desc = "A crate, purportedly from Space Russia."
|
||||
name = "soviet crate"
|
||||
icon_state = "sovietcrate"
|
||||
|
||||
/obj/structure/closet/crate/secure/hydroponics
|
||||
desc = "A crate with a lock on it, painted in the scheme of the station's botanists."
|
||||
name = "secure hydroponics crate"
|
||||
|
||||
@@ -43,6 +43,10 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup)
|
||||
attack_hand_speed = CLICK_CD_MELEE
|
||||
attack_hand_is_action = TRUE
|
||||
|
||||
explosion_flags = EXPLOSION_FLAG_HARD_OBSTACLE
|
||||
wave_explosion_block = EXPLOSION_BLOCK_WINDOW
|
||||
wave_explosion_multiply = EXPLOSION_DAMPEN_WINDOW
|
||||
|
||||
/// Electrochromatic status
|
||||
var/electrochromatic_status = NOT_ELECTROCHROMATIC
|
||||
/// Electrochromatic ID. Set the first character to ! to replace with a SSmapping generated pseudorandom obfuscated ID for mapping purposes.
|
||||
@@ -111,6 +115,9 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/structure/window/wave_explosion_damage(power, datum/wave_explosion/explosion)
|
||||
return EXPLOSION_POWER_STANDARD_SCALE_WINDOW_DAMAGE(power, explosion.window_shatter_mod)
|
||||
|
||||
/obj/structure/window/narsie_act()
|
||||
add_atom_colour(NARSIE_WINDOW_COLOUR, FIXED_COLOUR_PRIORITY)
|
||||
|
||||
@@ -520,6 +527,8 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup)
|
||||
armor = list("melee" = 50, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 25, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 100)
|
||||
max_integrity = 50
|
||||
explosion_block = 1
|
||||
wave_explosion_block = EXPLOSION_BLOCK_REINFORCED_WINDOW
|
||||
wave_explosion_multiply = EXPLOSION_DAMPEN_REINFORCED_WINDOW
|
||||
glass_type = /obj/item/stack/sheet/rglass
|
||||
rad_insulation = RAD_HEAVY_INSULATION
|
||||
ricochet_chance_mod = 0.8
|
||||
@@ -545,6 +554,8 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup)
|
||||
armor = list("melee" = 75, "bullet" = 5, "laser" = 0, "energy" = 0, "bomb" = 45, "bio" = 100, "rad" = 100, "fire" = 99, "acid" = 100)
|
||||
max_integrity = 150
|
||||
explosion_block = 1
|
||||
wave_explosion_block = EXPLOSION_BLOCK_BOROSILICATE_WINDOW
|
||||
wave_explosion_multiply = EXPLOSION_DAMPEN_BOROSILICATE_WINDOW
|
||||
glass_type = /obj/item/stack/sheet/plasmaglass
|
||||
cleanable_type = /obj/effect/decal/cleanable/glass/plasma
|
||||
rad_insulation = RAD_NO_INSULATION
|
||||
@@ -570,6 +581,8 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup)
|
||||
armor = list("melee" = 85, "bullet" = 20, "laser" = 0, "energy" = 0, "bomb" = 60, "bio" = 100, "rad" = 100, "fire" = 99, "acid" = 100)
|
||||
max_integrity = 500
|
||||
explosion_block = 2
|
||||
wave_explosion_block = EXPLOSION_BLOCK_EXTREME
|
||||
wave_explosion_multiply = EXPLOSION_BLOCK_EXTREME
|
||||
glass_type = /obj/item/stack/sheet/plasmarglass
|
||||
|
||||
/obj/structure/window/plasma/reinforced/spawner/east
|
||||
@@ -742,6 +755,8 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup)
|
||||
max_integrity = 80
|
||||
armor = list("melee" = 60, "bullet" = 25, "laser" = 0, "energy" = 0, "bomb" = 25, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 100)
|
||||
explosion_block = 2 //fancy AND hard to destroy. the most useful combination.
|
||||
wave_explosion_block = EXPLOSION_BLOCK_BOROSILICATE_WINDOW
|
||||
wave_explosion_multiply = EXPLOSION_DAMPEN_BOROSILICATE_WINDOW
|
||||
decon_speed = 40
|
||||
glass_type = /obj/item/stack/tile/brass
|
||||
glass_amount = 1
|
||||
|
||||
@@ -6,6 +6,8 @@
|
||||
blocks_air = 1
|
||||
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
|
||||
rad_insulation = RAD_MEDIUM_INSULATION
|
||||
wave_explosion_block = 10
|
||||
wave_explosion_multiply = 0.75
|
||||
|
||||
/turf/closed/Initialize()
|
||||
. = ..()
|
||||
@@ -28,6 +30,7 @@
|
||||
name = "wall"
|
||||
icon = 'icons/turf/walls.dmi'
|
||||
explosion_block = 50
|
||||
wave_explosion_block = INFINITY
|
||||
|
||||
/turf/closed/indestructible/rust_heretic_act()
|
||||
return
|
||||
|
||||
@@ -12,6 +12,19 @@
|
||||
clawfootstep = FOOTSTEP_HARD_CLAW
|
||||
heavyfootstep = FOOTSTEP_GENERIC_HEAVY
|
||||
|
||||
/// Minimum explosion power to break tile
|
||||
var/explosion_power_break_tile = EXPLOSION_POWER_FLOOR_TILE_BREAK
|
||||
/// Minimum explosion power to break turf
|
||||
var/explosion_power_break_turf = EXPLOSION_POWER_FLOOR_TURF_BREAK
|
||||
//// Minimum explosion power to scrape away the floor
|
||||
var/explosion_power_turf_scrape = EXPLOSION_POWER_FLOOR_TURF_SCRAPE
|
||||
//// Shielded turfs are completely protected from anything under this
|
||||
var/explosion_power_protect_shielded = EXPLOSION_POWER_FLOOR_SHIELDED_IMMUNITY
|
||||
/// Starting from here, there's a chance for this to break
|
||||
var/explosion_power_minimum_chance_break = EXPLOSION_POWER_FLOOR_MINIMUM_TURF_BREAK
|
||||
/// Starting from here, +20% chance to break turf.
|
||||
var/explosion_power_break_turf_bonus = EXPLOSION_POWER_FLOOR_TURF_BREAK_BONUS
|
||||
|
||||
var/icon_regular_floor = "floor" //used to remember what icon the tile should have by default
|
||||
var/icon_plating = "plating"
|
||||
thermal_conductivity = 0.004
|
||||
@@ -98,6 +111,48 @@
|
||||
src.break_tile()
|
||||
src.hotspot_expose(1000,CELL_VOLUME)
|
||||
|
||||
/turf/open/floor/wave_ex_act(power, datum/wave_explosion/explosion, dir)
|
||||
var/shielded = is_shielded()
|
||||
. = ..()
|
||||
if(shielded)
|
||||
if(power < explosion_power_protect_shielded)
|
||||
return
|
||||
else
|
||||
power -= explosion_power_protect_shielded
|
||||
hotspot_expose(1000, CELL_VOLUME)
|
||||
if(power < explosion_power_break_tile)
|
||||
return
|
||||
if(power < explosion_power_minimum_chance_break)
|
||||
if(prob(33 + ((explosion_power_break_turf - power) / (explosion_power_break_turf - explosion_power_break_tile))))
|
||||
break_tile()
|
||||
return
|
||||
if((power < explosion_power_turf_scrape) && ((power >= explosion_power_break_turf) || prob((1 - ((explosion_power_break_turf - power) / (explosion_power_break_turf - explosion_power_minimum_chance_break))) * 100 + ((power > explosion_power_break_turf_bonus)? 20 : 0))))
|
||||
switch(pick(1, 2;75, 3))
|
||||
if(1)
|
||||
if(!length(baseturfs) || !ispath(baseturfs[baseturfs.len-1], /turf/open/floor))
|
||||
ScrapeAway(flags = CHANGETURF_INHERIT_AIR)
|
||||
ReplaceWithLattice()
|
||||
else
|
||||
ScrapeAway(2, flags = CHANGETURF_INHERIT_AIR)
|
||||
if(prob(33))
|
||||
new /obj/item/stack/sheet/metal(src)
|
||||
return
|
||||
if(2)
|
||||
ScrapeAway(2, flags = CHANGETURF_INHERIT_AIR)
|
||||
return
|
||||
if(3)
|
||||
if(prob(80))
|
||||
ScrapeAway(flags = CHANGETURF_INHERIT_AIR)
|
||||
return
|
||||
else
|
||||
break_tile()
|
||||
hotspot_expose(1000,CELL_VOLUME)
|
||||
if(prob(33))
|
||||
new /obj/item/stack/sheet/metal(src)
|
||||
if(power >= explosion_power_turf_scrape)
|
||||
ScrapeAway(2, flags = CHANGETURF_INHERIT_AIR)
|
||||
return
|
||||
|
||||
/turf/open/floor/is_shielded()
|
||||
for(var/obj/structure/A in contents)
|
||||
if(A.level == 3)
|
||||
|
||||
@@ -12,6 +12,11 @@
|
||||
sheet_amount = 1
|
||||
girder_type = /obj/structure/girder/reinforced
|
||||
explosion_block = 2
|
||||
wave_explosion_block = EXPLOSION_BLOCK_BLAST_PROOF
|
||||
wave_explosion_multiply = EXPLOSION_DAMPEN_BLAST_PROOF
|
||||
explosion_power_to_scrape = EXPLOSION_POWER_RWALL_SCRAPE
|
||||
explosion_power_to_dismantle = EXPLOSION_POWER_RWALL_DISMANTLE
|
||||
explosion_power_minimum_chance_dismantle = EXPLOSION_POWER_RWALL_MINIMUM_DISMANTLE
|
||||
rad_insulation = RAD_HEAVY_INSULATION
|
||||
|
||||
/turf/closed/wall/r_wall/deconstruction_hints(mob/user)
|
||||
|
||||
@@ -6,6 +6,8 @@
|
||||
icon = 'icons/turf/walls/wall.dmi'
|
||||
icon_state = "wall"
|
||||
explosion_block = 1
|
||||
wave_explosion_block = EXPLOSION_BLOCK_WALL
|
||||
wave_explosion_multiply = EXPLOSION_DAMPEN_WALL
|
||||
flags_1 = DEFAULT_RICOCHET_1
|
||||
flags_ricochet = RICOCHET_HARD
|
||||
thermal_conductivity = WALL_HEAT_TRANSFER_COEFFICIENT
|
||||
@@ -15,6 +17,14 @@
|
||||
|
||||
baseturfs = /turf/open/floor/plating
|
||||
|
||||
explosion_flags = EXPLOSION_FLAG_HARD_OBSTACLE
|
||||
/// Explosion power to disintegrate the wall
|
||||
var/explosion_power_to_scrape = EXPLOSION_POWER_WALL_SCRAPE
|
||||
/// Explosion power to dismantle the wall
|
||||
var/explosion_power_to_dismantle = EXPLOSION_POWER_WALL_DISMANTLE
|
||||
/// Explosion power to potentially dismantle the wall
|
||||
var/explosion_power_minimum_chance_dismantle = EXPLOSION_POWER_WALL_MINIMUM_DISMANTLE
|
||||
|
||||
var/hardness = 40 //lower numbers are harder. Used to determine the probability of a hulk smashing through.
|
||||
var/slicing_duration = 100 //default time taken to slice the wall
|
||||
var/sheet_type = /obj/item/stack/sheet/metal
|
||||
@@ -91,6 +101,13 @@
|
||||
if(!density)
|
||||
..()
|
||||
|
||||
/turf/closed/wall/wave_ex_act(power, datum/wave_explosion/explosion, dir)
|
||||
. = ..()
|
||||
var/resultant_power = power * explosion.wall_destroy_mod
|
||||
if(resultant_power >= explosion_power_to_scrape)
|
||||
ScrapeAway()
|
||||
else if((resultant_power >= explosion_power_to_dismantle) || ((resultant_power >= explosion_power_minimum_chance_dismantle) && prob(((resultant_power - explosion_power_minimum_chance_dismantle) / (explosion_power_to_dismantle - explosion_power_minimum_chance_dismantle)) * 100)))
|
||||
dismantle_wall(prob((resultant_power - explosion_power_to_dismantle)/(explosion_power_to_scrape - explosion_power_to_dismantle)), TRUE)
|
||||
|
||||
/turf/closed/wall/blob_act(obj/structure/blob/B)
|
||||
if(prob(50))
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
temperature = TCMB
|
||||
thermal_conductivity = OPEN_HEAT_TRANSFER_COEFFICIENT
|
||||
heat_capacity = 700000
|
||||
wave_explosion_multiply = EXPLOSION_DAMPEN_SPACE
|
||||
wave_explosion_block = EXPLOSION_BLOCK_SPACE
|
||||
|
||||
var/destination_z
|
||||
var/destination_x
|
||||
|
||||
@@ -462,6 +462,24 @@ GLOBAL_LIST_EMPTY(station_turfs)
|
||||
A.ex_act(severity, target)
|
||||
CHECK_TICK
|
||||
|
||||
/turf/wave_ex_act(power, datum/wave_explosion/explosion, dir)
|
||||
. = ..()
|
||||
var/affecting_level
|
||||
if(is_shielded())
|
||||
affecting_level = 3
|
||||
else if(intact)
|
||||
affecting_level = 2
|
||||
else
|
||||
affecting_level = 1
|
||||
var/atom/A
|
||||
for(var/i in contents)
|
||||
if(. <= 0)
|
||||
return 0
|
||||
A = i
|
||||
if(!QDELETED(A) && A.level >= affecting_level)
|
||||
. = A.wave_explode(., explosion, dir)
|
||||
maptext = "[.]"
|
||||
|
||||
/turf/narsie_act(force, ignore_mobs, probability = 20)
|
||||
. = (prob(probability) || force)
|
||||
for(var/I in src)
|
||||
|
||||
@@ -96,6 +96,7 @@ GLOBAL_LIST_INIT(admin_verbs_fun, list(
|
||||
/client/proc/cmd_select_equipment,
|
||||
/client/proc/cmd_admin_gib_self,
|
||||
/client/proc/drop_bomb,
|
||||
/client/proc/drop_wave_explosion,
|
||||
/client/proc/set_dynex_scale,
|
||||
/client/proc/drop_dynex_bomb,
|
||||
/client/proc/cinematic,
|
||||
@@ -550,6 +551,51 @@ GLOBAL_PROTECT(admin_verbs_hideable)
|
||||
log_admin("[key_name(usr)] created an admin explosion at [epicenter.loc].")
|
||||
SSblackbox.record_feedback("tally", "admin_verb", 1, "Drop Bomb") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
/client/proc/drop_wave_explosion()
|
||||
set category = "Special Verbs"
|
||||
set name = "Drop Wave Explosion"
|
||||
set desc = "Cause an explosive shockwave at your location."
|
||||
|
||||
var/power = input(src, "Wave initial power", "Power", 50) as num|null
|
||||
if(isnull(power))
|
||||
return
|
||||
var/falloff = input(src, "Wave innate falloff factor", "Falloff", EXPLOSION_DEFAULT_FALLOFF_MULTIPLY) as num|null
|
||||
if(isnull(falloff))
|
||||
return
|
||||
falloff = max(0, falloff)
|
||||
if(falloff > 1)
|
||||
to_chat(src, "<span class='danger'>Aborting: Falloff cannot be higher tahn 1.")
|
||||
return
|
||||
var/constant = input(src, "Wave innate falloff constant", "Constant", EXPLOSION_DEFAULT_FALLOFF_SUBTRACT) as num|null
|
||||
if(isnull(constant))
|
||||
return
|
||||
if(constant < 0)
|
||||
to_chat(src, "<span class='danger'>Aborting: Falloff constant cannot be less than 0.")
|
||||
return
|
||||
var/fire = input(src, "Probability per tile of fire?", "Fire Probability", 0) as num|null
|
||||
if(isnull(fire))
|
||||
return
|
||||
var/speed = input(src, "Speed in ticks to wait between cycles? 0 for fast as possible", "Wait", 0) as num|null
|
||||
if(isnull(speed))
|
||||
return
|
||||
var/block_resistance = input(src, "DANGEROUS: Block resistance? USE 1 IF YOU DO NOT KNOW WHAT YOU ARE DOING.", "Block Negation", 1) as num|null
|
||||
if(isnull(block_resistance))
|
||||
return
|
||||
block_resistance = max(0, block_resistance)
|
||||
if(power > 500)
|
||||
var/sure = alert(src, "Explosion power is extremely high. Are you absolutely sure?", "Uhh...", "No", "Yes")
|
||||
if(sure != "Yes")
|
||||
return
|
||||
// point of no return
|
||||
var/turf/target = get_turf(mob)
|
||||
if(!target)
|
||||
to_chat(src, "<span class='danger'>Cannot proceed. Not on turf.</span>")
|
||||
return
|
||||
message_admins("[ADMIN_LOOKUPFLW(usr)] creating an admin explosion at [target.loc].")
|
||||
log_admin("[key_name(usr)] created an admin explosion at [target.loc].")
|
||||
SSblackbox.record_feedback("tally", "admin_verb", 1, "Drop Wave Explosion") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
wave_explosion(target, power, falloff, constant, null, fire, speed = speed, block_resistance = block_resistance)
|
||||
|
||||
/client/proc/drop_dynex_bomb()
|
||||
set category = "Admin.Fun"
|
||||
set name = "Drop DynEx Bomb"
|
||||
|
||||
@@ -41,7 +41,6 @@
|
||||
H.dna.features["horns"] = pick(GLOB.horns_list)
|
||||
H.dna.features["frills"] = pick(GLOB.frills_list)
|
||||
H.dna.features["spines"] = pick(GLOB.spines_list)
|
||||
H.dna.features["body_markings"] = pick(GLOB.body_markings_list)
|
||||
H.dna.features["insect_wings"] = pick(GLOB.insect_wings_list)
|
||||
H.dna.features["deco_wings"] = pick(GLOB.deco_wings_list)
|
||||
H.dna.features["insect_fluff"] = pick(GLOB.insect_fluffs_list)
|
||||
|
||||
@@ -238,3 +238,9 @@
|
||||
/proc/__nan()
|
||||
var/list/L = json_decode("{\"value\":NaN}")
|
||||
return L["value"]
|
||||
|
||||
/**
|
||||
* Wrapper to return a copy of contents, as SDQL2 can't tell an internal list from a normal list.
|
||||
*/
|
||||
/atom/proc/_contents()
|
||||
return contents.Copy()
|
||||
|
||||
@@ -571,6 +571,26 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
message_admins("[key_name_admin(src)] has created a command report")
|
||||
SSblackbox.record_feedback("tally", "admin_verb", 1, "Create Command Report") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
/client/proc/cmd_admin_make_priority_announcement()
|
||||
set category = "Admin.Events"
|
||||
set name = "Make Priority Announcement"
|
||||
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
var/input = input(usr, "Enter a priority announcement. Ensure it makes sense IC.", "What?", "") as message|null
|
||||
if(!input)
|
||||
return
|
||||
|
||||
var/title = input(src, "What should the title be?", "What?","") as text|null
|
||||
|
||||
var/special_name = input(src, "Who is making the announcement?", "Who?", "") as text|null
|
||||
priority_announce(input, title, sender_override = special_name)
|
||||
|
||||
log_admin("[key_name(src)] has sent a priority announcement: [input]")
|
||||
message_admins("[key_name_admin(src)] has made a priority announcement")
|
||||
SSblackbox.record_feedback("tally", "admin_verb", 1, "Make Priority Announcement") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
/client/proc/cmd_change_command_name()
|
||||
set category = "Admin.Events"
|
||||
set name = "Change Command Name"
|
||||
|
||||
@@ -111,7 +111,7 @@ GLOBAL_LIST_EMPTY(antagonists)
|
||||
var/datum/skill_modifier/job/M = GLOB.skill_modifiers[GET_SKILL_MOD_ID(A, type)]
|
||||
if(istype(M))
|
||||
M.name = "[name] Training"
|
||||
owner.AddComponent(/datum/component/activity)
|
||||
owner.current.AddComponent(/datum/component/activity)
|
||||
SEND_SIGNAL(owner.current, COMSIG_MOB_ANTAG_ON_GAIN, src)
|
||||
|
||||
/datum/antagonist/proc/is_banned(mob/M)
|
||||
@@ -164,14 +164,12 @@ GLOBAL_LIST_EMPTY(antagonists)
|
||||
/datum/antagonist/proc/remove_blacklisted_quirks()
|
||||
var/mob/living/L = owner.current
|
||||
if(istype(L))
|
||||
var/list/my_quirks = L.client?.prefs.all_quirks.Copy()
|
||||
SSquirks.filter_quirks(my_quirks,blacklisted_quirks)
|
||||
for(var/q in L.roundstart_quirks)
|
||||
var/datum/quirk/Q = q
|
||||
if(!(SSquirks.quirk_name_by_path(Q.type) in my_quirks))
|
||||
if(Q.type in blacklisted_quirks)
|
||||
if(initial(Q.antag_removal_text))
|
||||
to_chat(L, "<span class='boldannounce'>[initial(Q.antag_removal_text)]</span>")
|
||||
L.remove_quirk(Q.type)
|
||||
qdel(Q)
|
||||
|
||||
//Returns the team antagonist belongs to if any.
|
||||
/datum/antagonist/proc/get_team()
|
||||
|
||||
@@ -115,7 +115,7 @@
|
||||
skewee.visible_message("<span class='warning'>[skewee] painfully slides back down [src].</span>")
|
||||
if(skewee.stat >= UNCONSCIOUS)
|
||||
return //by ratvar, no more spamming my deadchat, holy fuck
|
||||
skewee.say("Oof, ouch owwie!!", forced = "fail brass skewer removal")
|
||||
skewee.emote("pain")
|
||||
return
|
||||
skewee.visible_message("<span class='danger'>[skewee] comes free of [src] with a squelching pop!</span>", \
|
||||
"<span class='boldannounce'>You come free of [src]!</span>")
|
||||
|
||||
@@ -62,13 +62,24 @@
|
||||
|
||||
/datum/action/innate/heretic_shatter/IsAvailable()
|
||||
if(IS_HERETIC(holder) || IS_HERETIC_MONSTER(holder))
|
||||
return TRUE
|
||||
return ..()
|
||||
else
|
||||
return FALSE
|
||||
|
||||
/datum/action/innate/heretic_shatter/Activate()
|
||||
if(do_after(holder,10, target = holder))
|
||||
var/turf/safe_turf = find_safe_turf(zlevels = sword.z, extended_safety_checks = TRUE)
|
||||
if(!sword || QDELETED(sword))
|
||||
return
|
||||
if(!IsAvailable()) //Never trust the user.
|
||||
return
|
||||
var/swordz = (get_turf(sword))?.z //SHOULD usually have a turf but if it doesn't better be prepared.
|
||||
if(!swordz)
|
||||
to_chat(holder, "<span class='warning'>[sword] flickers but remains in place, as do you...</span>")
|
||||
return
|
||||
var/turf/safe_turf = find_safe_turf(zlevels = swordz, extended_safety_checks = TRUE)
|
||||
if(!safe_turf)
|
||||
to_chat(holder, "<span class='warning'>[sword] flickers but remains in place, as do you...</span>")
|
||||
return
|
||||
do_teleport(holder,safe_turf,forceMove = TRUE,channel=TELEPORT_CHANNEL_MAGIC)
|
||||
to_chat(holder,"<span class='warning'>You feel a gust of energy flow through your body... the Rusted Hills heard your call...</span>")
|
||||
qdel(sword)
|
||||
@@ -218,8 +229,8 @@
|
||||
flags_inv = NONE
|
||||
flags_cover = NONE
|
||||
desc = "Black like tar, doesn't reflect any light. Runic symbols line the outside, with each flash you lose comprehension of what you are seeing."
|
||||
item_flags = EXAMINE_SKIP
|
||||
armor = list("melee" = 30, "bullet" = 30, "laser" = 30,"energy" = 30, "bomb" = 15, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
obj_flags = NONE | EXAMINE_SKIP
|
||||
|
||||
/obj/item/clothing/suit/hooded/cultrobes/void
|
||||
name = "void cloak"
|
||||
@@ -242,9 +253,10 @@
|
||||
//We need to account for the hood shenanigans, and that way we can make sure items always fit, even if one of the slots is used by the fucking hood.
|
||||
if(suittoggled)
|
||||
to_chat(carbon_user,"<span class='notice'>The light shifts around you making the cloak invisible!</span>")
|
||||
else
|
||||
obj_flags |= EXAMINE_SKIP
|
||||
else if(obj_flags & EXAMINE_SKIP) // ensures that it won't toggle visibility if raising the hood failed
|
||||
to_chat(carbon_user,"<span class='notice'>The kaleidoscope of colours collapses around you, as the cloak shifts to visibility!</span>")
|
||||
item_flags = suittoggled ? EXAMINE_SKIP : ~EXAMINE_SKIP
|
||||
obj_flags ^= EXAMINE_SKIP
|
||||
else
|
||||
to_chat(carbon_user,"<span class='danger'>You can't force the hood onto your head!</span>")
|
||||
|
||||
|
||||
@@ -633,7 +633,7 @@ This is here to make the tiles around the station mininuke change when it's arme
|
||||
AddComponent(/datum/component/stationloving, !fake)
|
||||
|
||||
/obj/item/disk/nuclear/process()
|
||||
++process_tick
|
||||
process_tick++
|
||||
if(fake)
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
CRASH("A fake nuke disk tried to call process(). Who the fuck and how the fuck")
|
||||
@@ -650,7 +650,7 @@ This is here to make the tiles around the station mininuke change when it's arme
|
||||
disk_comfort_level++
|
||||
|
||||
if(disk_comfort_level >= 2) //Sleep tight, disky.
|
||||
if(process_tick % 30)
|
||||
if(!(process_tick % 30))
|
||||
visible_message("<span class='notice'>[src] sleeps soundly. Sleep tight, disky.</span>")
|
||||
if(last_disk_move < world.time - 5000 && prob((world.time - 5000 - last_disk_move)*0.0001))
|
||||
var/datum/round_event_control/operative/loneop = locate(/datum/round_event_control/operative) in SSevents.control
|
||||
|
||||
@@ -177,6 +177,9 @@
|
||||
/mob/living/simple_animal/revenant/ex_act(severity, target)
|
||||
return 1 //Immune to the effects of explosions.
|
||||
|
||||
/mob/living/simple_animal/revenant/wave_ex_act(power, datum/wave_explosion/explosion, dir)
|
||||
return power
|
||||
|
||||
/mob/living/simple_animal/revenant/blob_act(obj/structure/blob/B)
|
||||
return //blah blah blobs aren't in tune with the spirit world, or something.
|
||||
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
return FALSE
|
||||
|
||||
/turf/proc/ImmediateCalculateAdjacentTurfs()
|
||||
var/canpass = CANATMOSPASS(src, src)
|
||||
var/canpass = CANATMOSPASS(src, src)
|
||||
var/canvpass = CANVERTICALATMOSPASS(src, src)
|
||||
for(var/direction in GLOB.cardinals_multiz)
|
||||
var/turf/T = get_step_multiz(src, direction)
|
||||
@@ -79,31 +79,27 @@
|
||||
if (atmos_adjacent_turfs)
|
||||
adjacent_turfs = atmos_adjacent_turfs.Copy()
|
||||
else
|
||||
adjacent_turfs = list()
|
||||
return list() // don't bother checking diagonals, diagonals are going to be cardinal checks anyways.
|
||||
|
||||
if (!alldir)
|
||||
return adjacent_turfs
|
||||
|
||||
var/turf/curloc = src
|
||||
|
||||
for (var/direction in GLOB.diagonals_multiz)
|
||||
var/matchingDirections = 0
|
||||
var/turf/S = get_step_multiz(curloc, direction)
|
||||
if(!S)
|
||||
var/turf/other
|
||||
var/turf/mid
|
||||
for (var/d in GLOB.diagonals)
|
||||
other = get_step(src, d)
|
||||
if(!other)
|
||||
continue
|
||||
// NS step
|
||||
mid = get_step(src, NSCOMPONENT(d))
|
||||
if((mid in adjacent_turfs) && (get_step(mid, EWCOMPONENT(d)) in adjacent_turfs))
|
||||
adjacent_turfs += other
|
||||
continue
|
||||
// EW step
|
||||
mid = get_step(src, EWCOMPONENT(d))
|
||||
if((mid in adjacent_turfs) && (get_step(mid, NSCOMPONENT(d)) in adjacent_turfs))
|
||||
adjacent_turfs += other
|
||||
continue
|
||||
|
||||
for (var/checkDirection in GLOB.cardinals_multiz)
|
||||
var/turf/checkTurf = get_step(S, checkDirection)
|
||||
if(!S.atmos_adjacent_turfs || !S.atmos_adjacent_turfs[checkTurf])
|
||||
continue
|
||||
|
||||
if (adjacent_turfs[checkTurf])
|
||||
matchingDirections++
|
||||
|
||||
if (matchingDirections >= 2)
|
||||
adjacent_turfs += S
|
||||
break
|
||||
|
||||
return adjacent_turfs
|
||||
|
||||
/atom/proc/air_update_turf(command = 0)
|
||||
|
||||
@@ -4,10 +4,10 @@ GLOBAL_DATUM(the_gateway, /obj/machinery/gateway/centerstation)
|
||||
GLOBAL_LIST_EMPTY(gateway_destinations)
|
||||
|
||||
/**
|
||||
* Corresponds to single entry in gateway control.
|
||||
*
|
||||
* Will NOT be added automatically to GLOB.gateway_destinations list.
|
||||
*/
|
||||
* Corresponds to single entry in gateway control.
|
||||
*
|
||||
* Will NOT be added automatically to GLOB.gateway_destinations list.
|
||||
*/
|
||||
/datum/gateway_destination
|
||||
var/name = "Unknown Destination"
|
||||
var/wait = 0 /// How long after roundstart this destination becomes active
|
||||
@@ -85,7 +85,7 @@ GLOBAL_LIST_EMPTY(gateway_destinations)
|
||||
. = "Exit gateway unpowered."
|
||||
|
||||
/datum/gateway_destination/gateway/get_target_turf()
|
||||
return get_step(target_gateway.portal,SOUTH)
|
||||
return get_step(target_gateway, SOUTH)
|
||||
|
||||
/datum/gateway_destination/gateway/post_transfer(atom/movable/AM)
|
||||
. = ..()
|
||||
@@ -144,7 +144,7 @@ GLOBAL_LIST_EMPTY(gateway_destinations)
|
||||
name = "gateway"
|
||||
desc = "A mysterious gateway built by unknown hands, it allows for faster than light travel to far-flung locations."
|
||||
icon = 'icons/obj/machines/gateway.dmi'
|
||||
icon_state = "off"
|
||||
icon_state = "portal_frame"
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
|
||||
|
||||
// 3x2 offset by one row
|
||||
@@ -171,10 +171,16 @@ GLOBAL_LIST_EMPTY(gateway_destinations)
|
||||
var/datum/gateway_destination/target
|
||||
/// bumper object, the thing that starts actual teleport
|
||||
var/obj/effect/gateway_portal_bumper/portal
|
||||
/// Visual object for handling the viscontents
|
||||
/// DISABLED DUE TO BYOND BUG CAUSING STACK OVERFLOWS OF ANY HUMAN INSTANTIATION NEAR AN ACTIVATED GATEWAY.
|
||||
/// Probably due to it referencing each other through the gateway (there's a deep loop, maybe BYOND isn't catching something when it usually would)
|
||||
// var/obj/effect/gateway_portal_effect/portal_visuals
|
||||
|
||||
/obj/machinery/gateway/Initialize()
|
||||
generate_destination()
|
||||
update_icon()
|
||||
// portal_visuals = new
|
||||
// vis_contents += portal_visuals
|
||||
return ..()
|
||||
|
||||
/obj/machinery/gateway/proc/generate_destination()
|
||||
@@ -191,6 +197,7 @@ GLOBAL_LIST_EMPTY(gateway_destinations)
|
||||
if(use_power == ACTIVE_POWER_USE)
|
||||
use_power = IDLE_POWER_USE
|
||||
update_icon()
|
||||
// portal_visuals.reset_visuals()
|
||||
|
||||
/obj/machinery/gateway/process()
|
||||
if((stat & (NOPOWER)) && use_power)
|
||||
@@ -198,12 +205,6 @@ GLOBAL_LIST_EMPTY(gateway_destinations)
|
||||
deactivate()
|
||||
return
|
||||
|
||||
/obj/machinery/gateway/update_icon_state()
|
||||
if(target)
|
||||
icon_state = "on"
|
||||
else
|
||||
icon_state = "off"
|
||||
|
||||
/obj/machinery/gateway/safe_throw_at(atom/target, range, speed, mob/thrower, spin = TRUE, diagonals_first = FALSE, datum/callback/callback, force = MOVE_FORCE_STRONG, gentle = FALSE)
|
||||
return
|
||||
|
||||
@@ -216,6 +217,7 @@ GLOBAL_LIST_EMPTY(gateway_destinations)
|
||||
return
|
||||
target = D
|
||||
target.activate(destination)
|
||||
// portal_visuals.setup_visuals(target)
|
||||
generate_bumper()
|
||||
use_power = ACTIVE_POWER_USE
|
||||
update_icon()
|
||||
@@ -307,7 +309,7 @@ GLOBAL_LIST_EMPTY(gateway_destinations)
|
||||
try_to_connect(D)
|
||||
return TRUE
|
||||
if("deactivate")
|
||||
if(G && G.target)
|
||||
if(G?.target)
|
||||
G.deactivate()
|
||||
return TRUE
|
||||
|
||||
@@ -324,3 +326,39 @@ GLOBAL_LIST_EMPTY(gateway_destinations)
|
||||
/obj/item/paper/fluff/gateway
|
||||
info = "Congratulations,<br><br>Your station has been selected to carry out the Gateway Project.<br><br>The equipment will be shipped to you at the start of the next quarter.<br> You are to prepare a secure location to house the equipment as outlined in the attached documents.<br><br>--Nanotrasen Bluespace Research"
|
||||
name = "Confidential Correspondence, Pg 1"
|
||||
|
||||
/obj/effect/gateway_portal_effect
|
||||
appearance_flags = KEEP_TOGETHER|TILE_BOUND|PIXEL_SCALE
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
vis_flags = VIS_INHERIT_ID
|
||||
layer = GATEWAY_UNDERLAY_LAYER //Slightly lower than gateway itself
|
||||
var/alpha_icon = 'icons/obj/machines/gateway.dmi'
|
||||
var/alpha_icon_state = "portal_mask"
|
||||
var/datum/gateway_destination/our_destination
|
||||
|
||||
|
||||
/obj/effect/gateway_portal_effect/proc/setup_visuals(datum/gateway_destination/D)
|
||||
our_destination = D
|
||||
update_portal_filters()
|
||||
|
||||
/obj/effect/gateway_portal_effect/proc/reset_visuals()
|
||||
our_destination = null
|
||||
update_portal_filters()
|
||||
|
||||
/obj/effect/gateway_portal_effect/proc/update_portal_filters()
|
||||
clear_filters()
|
||||
vis_contents = null
|
||||
|
||||
if(!our_destination)
|
||||
return
|
||||
|
||||
|
||||
add_filter("portal_alpha", 1, list("type" = "alpha", "icon" = icon(alpha_icon, alpha_icon_state), "x" = 32, "y" = 32))
|
||||
add_filter("portal_blur", 1, list("type" = "blur", "size" = 0.5))
|
||||
add_filter("portal_ripple", 1, list("type" = "ripple", "size" = 2, "radius" = 1, "falloff" = 1, "y" = 7))
|
||||
|
||||
animate(get_filter("portal_ripple"), time = 1.3 SECONDS, loop = -1, easing = LINEAR_EASING, radius = 32)
|
||||
|
||||
var/turf/center_turf = our_destination.get_target_turf()
|
||||
|
||||
vis_contents += block(locate(center_turf.x - 1, center_turf.y - 1, center_turf.z), locate(center_turf.x + 1, center_turf.y + 1, center_turf.z))
|
||||
|
||||
@@ -176,6 +176,7 @@
|
||||
/obj/effect/spawner/bundle/crate/surplusrifle,
|
||||
/obj/item/storage/toolbox/ammo/surplus)
|
||||
crate_name = "surplus military crate"
|
||||
crate_type = /obj/structure/closet/crate/secure/soviet
|
||||
|
||||
/datum/supply_pack/security/armory/russian/fill(obj/structure/closet/crate/C)
|
||||
for(var/i in 1 to 5)
|
||||
@@ -239,7 +240,6 @@
|
||||
desc = "Hey kid.. c'mere. Boss says we need to offload these, to any buyer, no questions asked. You pay us, we give you three of these guns, no strings attached. Locks are to ensure they get to PAYING customers."
|
||||
cost = 2000
|
||||
contraband = TRUE
|
||||
can_private_buy = TRUE
|
||||
contains = list(/obj/item/storage/fancy/cigarettes/derringer/smuggled,
|
||||
/obj/item/storage/fancy/cigarettes/derringer/smuggled,
|
||||
/obj/item/storage/fancy/cigarettes/derringer/smuggled,
|
||||
|
||||
@@ -98,6 +98,7 @@
|
||||
/obj/item/clothing/mask/gas,
|
||||
/obj/item/clothing/mask/gas)
|
||||
crate_name = "surplus russian clothing"
|
||||
crate_type = /obj/structure/closet/crate/secure/soviet
|
||||
|
||||
/datum/supply_pack/security/russian_partisan
|
||||
name = "Russian Partisan Gear"
|
||||
@@ -113,6 +114,7 @@
|
||||
/obj/item/clothing/under/syndicate/rus_army,
|
||||
/obj/item/clothing/mask/gas)
|
||||
crate_name = "surplus russian gear"
|
||||
crate_type = /obj/structure/closet/crate/secure/soviet
|
||||
|
||||
/datum/supply_pack/security/russian_partisan/fill(obj/structure/closet/crate/C)
|
||||
..()
|
||||
|
||||
@@ -124,7 +124,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
var/eye_type = DEFAULT_EYES_TYPE //Eye type
|
||||
var/split_eye_colors = FALSE
|
||||
var/datum/species/pref_species = new /datum/species/human() //Mutant race
|
||||
var/list/features = list("mcolor" = "FFFFFF", "mcolor2" = "FFFFFF", "mcolor3" = "FFFFFF", "tail_lizard" = "Smooth", "tail_human" = "None", "snout" = "Round", "horns" = "None", "horns_color" = "85615a", "ears" = "None", "wings" = "None", "wings_color" = "FFF", "frills" = "None", "deco_wings" = "None", "spines" = "None", "body_markings" = "None", "legs" = "Plantigrade", "insect_wings" = "Plain", "insect_fluff" = "None", "insect_markings" = "None", "arachnid_legs" = "Plain", "arachnid_spinneret" = "Plain", "arachnid_mandibles" = "Plain", "mam_body_markings" = "Plain", "mam_ears" = "None", "mam_snouts" = "None", "mam_tail" = "None", "mam_tail_animated" = "None", "xenodorsal" = "Standard", "xenohead" = "Standard", "xenotail" = "Xenomorph Tail", "taur" = "None", "genitals_use_skintone" = FALSE, "has_cock" = FALSE, "cock_shape" = DEF_COCK_SHAPE, "cock_length" = COCK_SIZE_DEF, "cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF, "cock_color" = "ffffff", "cock_taur" = FALSE, "has_balls" = FALSE, "balls_color" = "ffffff", "balls_shape" = DEF_BALLS_SHAPE, "balls_size" = BALLS_SIZE_DEF, "balls_cum_rate" = CUM_RATE, "balls_cum_mult" = CUM_RATE_MULT, "balls_efficiency" = CUM_EFFICIENCY, "has_breasts" = FALSE, "breasts_color" = "ffffff", "breasts_size" = BREASTS_SIZE_DEF, "breasts_shape" = DEF_BREASTS_SHAPE, "breasts_producing" = FALSE, "has_vag" = FALSE, "vag_shape" = DEF_VAGINA_SHAPE, "vag_color" = "ffffff", "has_womb" = FALSE, "balls_visibility" = GEN_VISIBLE_NO_UNDIES, "breasts_visibility"= GEN_VISIBLE_NO_UNDIES, "cock_visibility" = GEN_VISIBLE_NO_UNDIES, "vag_visibility" = GEN_VISIBLE_NO_UNDIES, "ipc_screen" = "Sunburst", "ipc_antenna" = "None", "flavor_text" = "", "silicon_flavor_text" = "", "ooc_notes" = "", "meat_type" = "Mammalian", "body_model" = MALE, "body_size" = RESIZE_DEFAULT_SIZE, "color_scheme" = OLD_CHARACTER_COLORING)
|
||||
var/list/features = list("mcolor" = "FFFFFF", "mcolor2" = "FFFFFF", "mcolor3" = "FFFFFF", "tail_lizard" = "Smooth", "tail_human" = "None", "snout" = "Round", "horns" = "None", "horns_color" = "85615a", "ears" = "None", "wings" = "None", "wings_color" = "FFF", "frills" = "None", "deco_wings" = "None", "spines" = "None", "legs" = "Plantigrade", "insect_wings" = "Plain", "insect_fluff" = "None", "insect_markings" = "None", "arachnid_legs" = "Plain", "arachnid_spinneret" = "Plain", "arachnid_mandibles" = "Plain", "mam_body_markings" = list(), "mam_ears" = "None", "mam_snouts" = "None", "mam_tail" = "None", "mam_tail_animated" = "None", "xenodorsal" = "Standard", "xenohead" = "Standard", "xenotail" = "Xenomorph Tail", "taur" = "None", "genitals_use_skintone" = FALSE, "has_cock" = FALSE, "cock_shape" = DEF_COCK_SHAPE, "cock_length" = COCK_SIZE_DEF, "cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF, "cock_color" = "ffffff", "cock_taur" = FALSE, "has_balls" = FALSE, "balls_color" = "ffffff", "balls_shape" = DEF_BALLS_SHAPE, "balls_size" = BALLS_SIZE_DEF, "balls_cum_rate" = CUM_RATE, "balls_cum_mult" = CUM_RATE_MULT, "balls_efficiency" = CUM_EFFICIENCY, "has_breasts" = FALSE, "breasts_color" = "ffffff", "breasts_size" = BREASTS_SIZE_DEF, "breasts_shape" = DEF_BREASTS_SHAPE, "breasts_producing" = FALSE, "has_vag" = FALSE, "vag_shape" = DEF_VAGINA_SHAPE, "vag_color" = "ffffff", "has_womb" = FALSE, "balls_visibility" = GEN_VISIBLE_NO_UNDIES, "breasts_visibility"= GEN_VISIBLE_NO_UNDIES, "cock_visibility" = GEN_VISIBLE_NO_UNDIES, "vag_visibility" = GEN_VISIBLE_NO_UNDIES, "ipc_screen" = "Sunburst", "ipc_antenna" = "None", "flavor_text" = "", "silicon_flavor_text" = "", "ooc_notes" = "", "meat_type" = "Mammalian", "body_model" = MALE, "body_size" = RESIZE_DEFAULT_SIZE, "color_scheme" = OLD_CHARACTER_COLORING)
|
||||
|
||||
var/custom_speech_verb = "default" //if your say_mod is to be something other than your races
|
||||
var/custom_tongue = "default" //if your tongue is to be something other than your races
|
||||
@@ -514,7 +514,76 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
dat += "</td>"
|
||||
mutant_category = 0
|
||||
|
||||
// rp marking selection
|
||||
// assume you can only have mam markings or regular markings or none, never both
|
||||
var/marking_type
|
||||
if(parent.can_have_part("mam_body_markings"))
|
||||
marking_type = "mam_body_markings"
|
||||
if(marking_type)
|
||||
dat += APPEARANCE_CATEGORY_COLUMN
|
||||
dat += "<h3>[GLOB.all_mutant_parts[marking_type]]</h3>" // give it the appropriate title for the type of marking
|
||||
dat += "<a href='?_src_=prefs;preference=marking_add;marking_type=[marking_type];task=input'>Add marking</a>"
|
||||
// list out the current markings you have
|
||||
if(length(features[marking_type]))
|
||||
dat += "<table>"
|
||||
var/list/markings = features[marking_type]
|
||||
if(!islist(markings))
|
||||
// something went terribly wrong
|
||||
markings = list()
|
||||
var/list/reverse_markings = reverseList(markings)
|
||||
for(var/list/marking_list in reverse_markings)
|
||||
var/marking_index = markings.Find(marking_list) // consider changing loop to go through indexes over lists instead of using Find here
|
||||
var/limb_value = marking_list[1]
|
||||
var/actual_name = GLOB.bodypart_names[num2text(limb_value)] // get the actual name from the bitflag representing the part the marking is applied to
|
||||
var/color_marking_dat = ""
|
||||
var/number_colors = 1
|
||||
var/datum/sprite_accessory/mam_body_markings/S = GLOB.mam_body_markings_list[marking_list[2]]
|
||||
var/matrixed_sections = S.covered_limbs[actual_name]
|
||||
if(S && matrixed_sections)
|
||||
// if it has nothing initialize it to white
|
||||
if(length(marking_list) == 2)
|
||||
var/first = "#FFFFFF"
|
||||
var/second = "#FFFFFF"
|
||||
var/third = "#FFFFFF"
|
||||
if(features["mcolor"])
|
||||
first = "#[features["mcolor"]]"
|
||||
if(features["mcolor2"])
|
||||
second = "#[features["mcolor2"]]"
|
||||
if(features["mcolor3"])
|
||||
third = "#[features["mcolor3"]]"
|
||||
marking_list += list(list(first, second, third)) // just assume its 3 colours if it isnt it doesnt matter we just wont use the other values
|
||||
// index magic
|
||||
var/primary_index = 1
|
||||
var/secondary_index = 2
|
||||
var/tertiary_index = 3
|
||||
switch(matrixed_sections)
|
||||
if(MATRIX_GREEN)
|
||||
primary_index = 2
|
||||
if(MATRIX_BLUE)
|
||||
primary_index = 3
|
||||
if(MATRIX_RED_BLUE)
|
||||
secondary_index = 2
|
||||
if(MATRIX_GREEN_BLUE)
|
||||
primary_index = 2
|
||||
secondary_index = 3
|
||||
|
||||
// we know it has one matrixed section at minimum
|
||||
color_marking_dat += "<span style='border: 1px solid #161616; background-color: [marking_list[3][primary_index]];'> </span>"
|
||||
// if it has a second section, add it
|
||||
if(matrixed_sections == MATRIX_RED_BLUE || matrixed_sections == MATRIX_GREEN_BLUE || matrixed_sections == MATRIX_RED_GREEN || matrixed_sections == MATRIX_ALL)
|
||||
color_marking_dat += "<span style='border: 1px solid #161616; background-color: [marking_list[3][secondary_index]];'> </span>"
|
||||
number_colors = 2
|
||||
// if it has a third section, add it
|
||||
if(matrixed_sections == MATRIX_ALL)
|
||||
color_marking_dat += "<span style='border: 1px solid #161616; background-color: [marking_list[3][tertiary_index]];'> </span>"
|
||||
number_colors = 3
|
||||
color_marking_dat += " <a href='?_src_=prefs;preference=marking_color;marking_index=[marking_index];marking_type=[marking_type];number_colors=[number_colors];task=input'>Change</a><BR>"
|
||||
dat += "<tr><td>[marking_list[2]] - [actual_name]</td> <td><a href='?_src_=prefs;preference=marking_down;task=input;marking_index=[marking_index];marking_type=[marking_type];'>˄</a> <a href='?_src_=prefs;preference=marking_up;task=input;marking_index=[marking_index];marking_type=[marking_type]'>˅</a> <a href='?_src_=prefs;preference=marking_remove;task=input;marking_index=[marking_index];marking_type=[marking_type]'>X</a> [color_marking_dat]</td></tr>"
|
||||
dat += "</table>"
|
||||
|
||||
for(var/mutant_part in GLOB.all_mutant_parts)
|
||||
if(mutant_part == "mam_body_markings")
|
||||
continue
|
||||
if(parent.can_have_part(mutant_part))
|
||||
if(!mutant_category)
|
||||
dat += APPEARANCE_CATEGORY_COLUMN
|
||||
@@ -533,8 +602,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
if(accessory)
|
||||
if(accessory.color_src == MATRIXED || accessory.color_src == MUTCOLORS || accessory.color_src == MUTCOLORS2 || accessory.color_src == MUTCOLORS3) //mutcolors1-3 are deprecated now, please don't rely on these in the future
|
||||
var/mutant_string = accessory.mutant_part_string
|
||||
if(istype(accessory, /datum/sprite_accessory/mam_body_markings) || istype(accessory, /datum/sprite_accessory/body_markings))
|
||||
continue
|
||||
var/primary_feature = "[mutant_string]_primary"
|
||||
var/secondary_feature = "[mutant_string]_secondary"
|
||||
var/tertiary_feature = "[mutant_string]_tertiary"
|
||||
@@ -1726,13 +1793,11 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
pref_species = new newtype()
|
||||
//let's ensure that no weird shit happens on species swapping.
|
||||
custom_species = null
|
||||
if(!parent.can_have_part("body_markings"))
|
||||
features["body_markings"] = "None"
|
||||
if(!parent.can_have_part("mam_body_markings"))
|
||||
features["mam_body_markings"] = "None"
|
||||
features["mam_body_markings"] = list()
|
||||
if(parent.can_have_part("mam_body_markings"))
|
||||
if(features["mam_body_markings"] == "None")
|
||||
features["mam_body_markings"] = "Plain"
|
||||
features["mam_body_markings"] = list()
|
||||
if(parent.can_have_part("tail_lizard"))
|
||||
features["tail_lizard"] = "Smooth"
|
||||
if(pref_species.id == "felinid")
|
||||
@@ -1961,14 +2026,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
if(new_spines)
|
||||
features["spines"] = new_spines
|
||||
|
||||
if("body_markings")
|
||||
var/new_body_markings
|
||||
new_body_markings = input(user, "Choose your character's body markings:", "Character Preference") as null|anything in GLOB.body_markings_list
|
||||
if(new_body_markings)
|
||||
features["body_markings"] = new_body_markings
|
||||
if(new_body_markings != "None")
|
||||
features["mam_body_markings"] = "None"
|
||||
|
||||
if("legs")
|
||||
var/new_legs
|
||||
new_legs = input(user, "Choose your character's legs:", "Character Preference") as null|anything in GLOB.legs_list
|
||||
@@ -2088,26 +2145,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
if(new_ears)
|
||||
features["mam_ears"] = new_ears
|
||||
|
||||
if("mam_body_markings")
|
||||
var/list/snowflake_markings_list = list()
|
||||
for(var/path in GLOB.mam_body_markings_list)
|
||||
var/datum/sprite_accessory/mam_body_markings/instance = GLOB.mam_body_markings_list[path]
|
||||
if(istype(instance, /datum/sprite_accessory))
|
||||
var/datum/sprite_accessory/S = instance
|
||||
if(!show_mismatched_markings && S.recommended_species && !S.recommended_species.Find(pref_species.id))
|
||||
continue
|
||||
if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(user.client.ckey)))
|
||||
snowflake_markings_list[S.name] = path
|
||||
var/new_mam_body_markings
|
||||
new_mam_body_markings = input(user, "Choose your character's body markings:", "Character Preference") as null|anything in snowflake_markings_list
|
||||
if(new_mam_body_markings)
|
||||
features["mam_body_markings"] = new_mam_body_markings
|
||||
if(new_mam_body_markings != "None")
|
||||
features["body_markings"] = "None"
|
||||
else if(new_mam_body_markings == "None")
|
||||
features["mam_body_markings"] = "Plain"
|
||||
features["body_markings"] = "None"
|
||||
|
||||
//Xeno Bodyparts
|
||||
if("xenohead")//Head or caste type
|
||||
var/new_head
|
||||
@@ -2133,7 +2170,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
features["xenodorsal"] = new_dors
|
||||
|
||||
//every single primary/secondary/tertiary colouring done at once
|
||||
if("xenodorsal_primary","xenodorsal_secondary","xenodorsal_tertiary","xhead_primary","xhead_secondary","xhead_tertiary","tail_primary","tail_secondary","tail_tertiary","insect_markings_primary","insect_markings_secondary","insect_markings_tertiary","body_markings_primary","body_markings_secondary","body_markings_tertiary","insect_fluff_primary","insect_fluff_secondary","insect_fluff_tertiary","ears_primary","ears_secondary","ears_tertiary","frills_primary","frills_secondary","frills_tertiary","ipc_antenna_primary","ipc_antenna_secondary","ipc_antenna_tertiary","taur_primary","taur_secondary","taur_tertiary","snout_primary","snout_secondary","snout_tertiary","spines_primary","spines_secondary","spines_tertiary", "mam_body_markings_primary", "mam_body_markings_secondary", "mam_body_markings_tertiary")
|
||||
if("xenodorsal_primary","xenodorsal_secondary","xenodorsal_tertiary","xhead_primary","xhead_secondary","xhead_tertiary","tail_primary","tail_secondary","tail_tertiary","insect_markings_primary","insect_markings_secondary","insect_markings_tertiary","insect_fluff_primary","insect_fluff_secondary","insect_fluff_tertiary","ears_primary","ears_secondary","ears_tertiary","frills_primary","frills_secondary","frills_tertiary","ipc_antenna_primary","ipc_antenna_secondary","ipc_antenna_tertiary","taur_primary","taur_secondary","taur_tertiary","snout_primary","snout_secondary","snout_tertiary","spines_primary","spines_secondary","spines_tertiary", "mam_body_markings_primary", "mam_body_markings_secondary", "mam_body_markings_tertiary")
|
||||
var/the_feature = features[href_list["preference"]]
|
||||
if(!the_feature)
|
||||
features[href_list["preference"]] = "FFFFFF"
|
||||
@@ -2390,6 +2427,111 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
var/selected_body_sprite = input(user, "Choose your desired body sprite", "Character Preference") as null|anything in pref_species.allowed_limb_ids
|
||||
if(selected_body_sprite)
|
||||
chosen_limb_id = selected_body_sprite //this gets sanitized before loading
|
||||
|
||||
if("marking_down")
|
||||
// move the specified marking down
|
||||
var/index = text2num(href_list["marking_index"])
|
||||
var/marking_type = href_list["marking_type"]
|
||||
if(index && marking_type && features[marking_type] && index != length(features[marking_type]))
|
||||
var/index_down = index + 1
|
||||
var/markings = features[marking_type]
|
||||
var/first_marking = markings[index]
|
||||
var/second_marking = markings[index_down]
|
||||
markings[index] = second_marking
|
||||
markings[index_down] = first_marking
|
||||
|
||||
if("marking_up")
|
||||
// move the specified marking up
|
||||
var/index = text2num(href_list["marking_index"])
|
||||
var/marking_type = href_list["marking_type"]
|
||||
if(index && marking_type && features[marking_type] && index != 1)
|
||||
var/index_up = index - 1
|
||||
var/markings = features[marking_type]
|
||||
var/first_marking = markings[index]
|
||||
var/second_marking = markings[index_up]
|
||||
markings[index] = second_marking
|
||||
markings[index_up] = first_marking
|
||||
|
||||
if("marking_remove")
|
||||
// move the specified marking up
|
||||
var/index = text2num(href_list["marking_index"])
|
||||
var/marking_type = href_list["marking_type"]
|
||||
if(index && marking_type && features[marking_type])
|
||||
// because linters are just absolutely awful:
|
||||
var/list/L = features[marking_type]
|
||||
L.Cut(index, index + 1)
|
||||
|
||||
if("marking_add")
|
||||
// add a marking
|
||||
var/marking_type = href_list["marking_type"]
|
||||
if(marking_type && features[marking_type])
|
||||
var/selected_limb = input(user, "Choose the limb to apply to.", "Character Preference") as null|anything in list("Head", "Chest", "Left Arm", "Right Arm", "Left Leg", "Right Leg", "All")
|
||||
if(selected_limb)
|
||||
var/list/marking_list = GLOB.mam_body_markings_list
|
||||
var/list/snowflake_markings_list = list()
|
||||
for(var/path in marking_list)
|
||||
var/datum/sprite_accessory/S = marking_list[path]
|
||||
if(istype(S))
|
||||
if(istype(S, /datum/sprite_accessory/mam_body_markings))
|
||||
var/datum/sprite_accessory/mam_body_markings/marking = S
|
||||
if(!(selected_limb in marking.covered_limbs) && selected_limb != "All")
|
||||
continue
|
||||
|
||||
if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(user.client.ckey)))
|
||||
snowflake_markings_list[S.name] = path
|
||||
|
||||
var/selected_marking = input(user, "Select the marking to apply to the limb.") as null|anything in snowflake_markings_list
|
||||
if(selected_marking)
|
||||
if(selected_limb != "All")
|
||||
var/limb_value = text2num(GLOB.bodypart_values[selected_limb])
|
||||
features[marking_type] += list(list(limb_value, selected_marking))
|
||||
else
|
||||
var/datum/sprite_accessory/mam_body_markings/S = marking_list[selected_marking]
|
||||
for(var/limb in S.covered_limbs)
|
||||
var/limb_value = text2num(GLOB.bodypart_values[limb])
|
||||
features[marking_type] += list(list(limb_value, selected_marking))
|
||||
|
||||
if("marking_color")
|
||||
var/index = text2num(href_list["marking_index"])
|
||||
var/marking_type = href_list["marking_type"]
|
||||
if(index && marking_type && features[marking_type])
|
||||
// work out the input options to show the user
|
||||
var/list/options = list("Primary")
|
||||
var/number_colors = text2num(href_list["number_colors"])
|
||||
var/color_number = 1 // 1-3 which color are we editing
|
||||
if(number_colors >= 2)
|
||||
options += "Secondary"
|
||||
if(number_colors == 3)
|
||||
options += "Tertiary"
|
||||
var/color_option = input(user, "Select the colour you wish to edit") as null|anything in options
|
||||
if(color_option)
|
||||
if(color_option == "Secondary") color_number = 2
|
||||
if(color_option == "Tertiary") color_number = 3
|
||||
// perform some magic on the color number
|
||||
var/list/marking_list = features[marking_type][index]
|
||||
var/datum/sprite_accessory/mam_body_markings/S = GLOB.mam_body_markings_list[marking_list[2]]
|
||||
var/matrixed_sections = S.covered_limbs[GLOB.bodypart_names[num2text(marking_list[1])]]
|
||||
if(color_number == 1)
|
||||
switch(matrixed_sections)
|
||||
if(MATRIX_GREEN)
|
||||
color_number = 2
|
||||
if(MATRIX_BLUE)
|
||||
color_number = 3
|
||||
else if(color_number == 2)
|
||||
switch(matrixed_sections)
|
||||
if(MATRIX_RED_BLUE)
|
||||
color_number = 3
|
||||
if(MATRIX_GREEN_BLUE)
|
||||
color_number = 3
|
||||
|
||||
var/color_list = features[marking_type][index][3]
|
||||
var/new_marking_color = input(user, "Choose your character's marking color:", "Character Preference","#"+color_list[color_number]) as color|null
|
||||
if(new_marking_color)
|
||||
var/temp_hsv = RGBtoHSV(new_marking_color)
|
||||
if((MUTCOLORS_PARTSONLY in pref_species.species_traits) || ReadHSV(temp_hsv)[3] >= ReadHSV(MINIMUM_MUTANT_COLOR)[3]) // mutantcolors must be bright, but only if they affect the skin
|
||||
color_list[color_number] = "#[sanitize_hexcolor(new_marking_color, 6)]"
|
||||
else
|
||||
to_chat(user, "<span class='danger'>Invalid color. Your color is not bright enough.</span>")
|
||||
else
|
||||
switch(href_list["preference"])
|
||||
//CITADEL PREFERENCES EDIT - I can't figure out how to modularize these, so they have to go here. :c -Pooj
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
// You do not need to raise this if you are adding new values that have sane defaults.
|
||||
// Only raise this value when changing the meaning/format/name/layout of an existing value
|
||||
// where you would want the updater procs below to run
|
||||
#define SAVEFILE_VERSION_MAX 50
|
||||
#define SAVEFILE_VERSION_MAX 52
|
||||
|
||||
/*
|
||||
SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn
|
||||
@@ -283,7 +283,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
qdel(temporary_gear_item)
|
||||
//it's double packed into a list because += will union the two lists contents
|
||||
|
||||
S["loadout"] = safe_json_encode(loadout_data)
|
||||
S["loadout"] = loadout_data
|
||||
|
||||
if(current_version < 48) //unlockable loadout items but we need to clear bad data from a mistake
|
||||
S["unlockable_loadout"] = list()
|
||||
@@ -295,6 +295,51 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
L -= ROLE_SYNDICATE
|
||||
S["be_special"] << L
|
||||
|
||||
if(current_version < 51) //humans can have digi legs now, make sure they dont default to them or human players will murder me in my sleep
|
||||
if(S["species"] == SPECIES_HUMAN)
|
||||
features["legs"] = "Plantigrade"
|
||||
|
||||
if(current_version < 52) // rp markings means markings are now stored as a list, lizard markings now mam like the rest
|
||||
var/marking_type
|
||||
var/species_id = S["species"]
|
||||
var/datum/species/actual_species = GLOB.species_datums[species_id]
|
||||
|
||||
// convert lizard markings to lizard markings
|
||||
if(species_id == SPECIES_LIZARD && S["feature_lizard_body_markings"])
|
||||
features["mam_body_markings"] = features["body_markings"]
|
||||
|
||||
// convert mam body marking data to the new rp marking data
|
||||
if(actual_species.mutant_bodyparts["mam_body_markings"] && S["feature_mam_body_markings"]) marking_type = "feature_mam_body_markings"
|
||||
|
||||
if(marking_type)
|
||||
var/old_marking_value = S[marking_type]
|
||||
var/list/color_list = list("#FFFFFF","#FFFFFF","#FFFFFF")
|
||||
|
||||
if(S["feature_mcolor"]) color_list[1] = "#" + S["feature_mcolor"]
|
||||
if(S["feature_mcolor2"]) color_list[2] = "#" + S["feature_mcolor2"]
|
||||
if(S["feature_mcolor3"]) color_list[3] = "#" + S["feature_mcolor3"]
|
||||
|
||||
var/list/marking_list = list()
|
||||
for(var/part in list(ARM_LEFT, ARM_RIGHT, LEG_LEFT, LEG_RIGHT, CHEST, HEAD))
|
||||
var/list/copied_color_list = color_list.Copy()
|
||||
var/datum/sprite_accessory/mam_body_markings/mam_marking = GLOB.mam_body_markings_list[old_marking_value]
|
||||
var/part_name = GLOB.bodypart_names[num2text(part)]
|
||||
if(length(mam_marking.covered_limbs) && mam_marking.covered_limbs[part_name])
|
||||
var/matrixed_sections = mam_marking.covered_limbs[part_name]
|
||||
// just trust me this is fine
|
||||
switch(matrixed_sections)
|
||||
if(MATRIX_GREEN)
|
||||
copied_color_list[1] = copied_color_list[2]
|
||||
if(MATRIX_BLUE)
|
||||
copied_color_list[1] = copied_color_list[3]
|
||||
if(MATRIX_RED_BLUE)
|
||||
copied_color_list[2] = copied_color_list[3]
|
||||
if(MATRIX_GREEN_BLUE)
|
||||
copied_color_list[1] = copied_color_list[2]
|
||||
copied_color_list[2] = copied_color_list[3]
|
||||
marking_list += list(list(part, old_marking_value, copied_color_list))
|
||||
features["mam_body_markings"] = marking_list
|
||||
|
||||
/datum/preferences/proc/load_path(ckey,filename="preferences.sav")
|
||||
if(!ckey)
|
||||
return
|
||||
@@ -579,7 +624,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
var/savefile/S = new /savefile(path)
|
||||
if(!S)
|
||||
return FALSE
|
||||
features = list("mcolor" = "FFFFFF", "mcolor2" = "FFFFFF", "mcolor3" = "FFFFFF", "tail_lizard" = "Smooth", "tail_human" = "None", "snout" = "Round", "horns" = "None", "horns_color" = "85615a", "ears" = "None", "wings" = "None", "wings_color" = "FFF", "frills" = "None", "deco_wings" = "None", "spines" = "None", "body_markings" = "None", "legs" = "Plantigrade", "insect_wings" = "Plain", "insect_fluff" = "None", "insect_markings" = "None", "arachnid_legs" = "Plain", "arachnid_spinneret" = "Plain", "arachnid_mandibles" = "Plain", "mam_body_markings" = "Plain", "mam_ears" = "None", "mam_snouts" = "None", "mam_tail" = "None", "mam_tail_animated" = "None", "xenodorsal" = "Standard", "xenohead" = "Standard", "xenotail" = "Xenomorph Tail", "taur" = "None", "genitals_use_skintone" = FALSE, "has_cock" = FALSE, "cock_shape" = DEF_COCK_SHAPE, "cock_length" = COCK_SIZE_DEF, "cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF, "cock_color" = "ffffff", "cock_taur" = FALSE, "has_balls" = FALSE, "balls_color" = "ffffff", "balls_shape" = DEF_BALLS_SHAPE, "balls_size" = BALLS_SIZE_DEF, "balls_cum_rate" = CUM_RATE, "balls_cum_mult" = CUM_RATE_MULT, "balls_efficiency" = CUM_EFFICIENCY, "has_breasts" = FALSE, "breasts_color" = "ffffff", "breasts_size" = BREASTS_SIZE_DEF, "breasts_shape" = DEF_BREASTS_SHAPE, "breasts_producing" = FALSE, "has_vag" = FALSE, "vag_shape" = DEF_VAGINA_SHAPE, "vag_color" = "ffffff", "has_womb" = FALSE, "balls_visibility" = GEN_VISIBLE_NO_UNDIES, "breasts_visibility"= GEN_VISIBLE_NO_UNDIES, "cock_visibility" = GEN_VISIBLE_NO_UNDIES, "vag_visibility" = GEN_VISIBLE_NO_UNDIES, "ipc_screen" = "Sunburst", "ipc_antenna" = "None", "flavor_text" = "", "silicon_flavor_text" = "", "ooc_notes" = "", "meat_type" = "Mammalian", "body_model" = MALE, "body_size" = RESIZE_DEFAULT_SIZE, "color_scheme" = OLD_CHARACTER_COLORING)
|
||||
features = list("mcolor" = "FFFFFF", "mcolor2" = "FFFFFF", "mcolor3" = "FFFFFF", "tail_lizard" = "Smooth", "tail_human" = "None", "snout" = "Round", "horns" = "None", "horns_color" = "85615a", "ears" = "None", "wings" = "None", "wings_color" = "FFF", "frills" = "None", "deco_wings" = "None", "spines" = "None", "legs" = "Plantigrade", "insect_wings" = "Plain", "insect_fluff" = "None", "insect_markings" = "None", "arachnid_legs" = "Plain", "arachnid_spinneret" = "Plain", "arachnid_mandibles" = "Plain", "mam_body_markings" = "Plain", "mam_ears" = "None", "mam_snouts" = "None", "mam_tail" = "None", "mam_tail_animated" = "None", "xenodorsal" = "Standard", "xenohead" = "Standard", "xenotail" = "Xenomorph Tail", "taur" = "None", "genitals_use_skintone" = FALSE, "has_cock" = FALSE, "cock_shape" = DEF_COCK_SHAPE, "cock_length" = COCK_SIZE_DEF, "cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF, "cock_color" = "ffffff", "cock_taur" = FALSE, "has_balls" = FALSE, "balls_color" = "ffffff", "balls_shape" = DEF_BALLS_SHAPE, "balls_size" = BALLS_SIZE_DEF, "balls_cum_rate" = CUM_RATE, "balls_cum_mult" = CUM_RATE_MULT, "balls_efficiency" = CUM_EFFICIENCY, "has_breasts" = FALSE, "breasts_color" = "ffffff", "breasts_size" = BREASTS_SIZE_DEF, "breasts_shape" = DEF_BREASTS_SHAPE, "breasts_producing" = FALSE, "has_vag" = FALSE, "vag_shape" = DEF_VAGINA_SHAPE, "vag_color" = "ffffff", "has_womb" = FALSE, "balls_visibility" = GEN_VISIBLE_NO_UNDIES, "breasts_visibility"= GEN_VISIBLE_NO_UNDIES, "cock_visibility" = GEN_VISIBLE_NO_UNDIES, "vag_visibility" = GEN_VISIBLE_NO_UNDIES, "ipc_screen" = "Sunburst", "ipc_antenna" = "None", "flavor_text" = "", "silicon_flavor_text" = "", "ooc_notes" = "", "meat_type" = "Mammalian", "body_model" = MALE, "body_size" = RESIZE_DEFAULT_SIZE, "color_scheme" = OLD_CHARACTER_COLORING)
|
||||
|
||||
S.cd = "/"
|
||||
if(!slot)
|
||||
@@ -649,7 +694,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
S["feature_lizard_horns"] >> features["horns"]
|
||||
S["feature_lizard_frills"] >> features["frills"]
|
||||
S["feature_lizard_spines"] >> features["spines"]
|
||||
S["feature_lizard_body_markings"] >> features["body_markings"]
|
||||
S["feature_lizard_legs"] >> features["legs"]
|
||||
S["feature_human_tail"] >> features["tail_human"]
|
||||
S["feature_human_ears"] >> features["ears"]
|
||||
@@ -718,7 +762,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
S["feature_genitals_use_skintone"] >> features["genitals_use_skintone"]
|
||||
S["feature_mcolor2"] >> features["mcolor2"]
|
||||
S["feature_mcolor3"] >> features["mcolor3"]
|
||||
S["feature_mam_body_markings"] >> features["mam_body_markings"]
|
||||
// note safe json decode will runtime the first time it migrates but this is fine and it solves itself don't worry about it if you see it error
|
||||
features["mam_body_markings"] = safe_json_decode(S["feature_mam_body_markings"])
|
||||
S["feature_mam_tail"] >> features["mam_tail"]
|
||||
S["feature_mam_ears"] >> features["mam_ears"]
|
||||
S["feature_mam_tail_animated"] >> features["mam_tail_animated"]
|
||||
@@ -848,7 +893,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
features["ears"] = sanitize_inlist(features["ears"], GLOB.ears_list)
|
||||
features["frills"] = sanitize_inlist(features["frills"], GLOB.frills_list)
|
||||
features["spines"] = sanitize_inlist(features["spines"], GLOB.spines_list)
|
||||
features["body_markings"] = sanitize_inlist(features["body_markings"], GLOB.body_markings_list)
|
||||
features["legs"] = sanitize_inlist(features["legs"], GLOB.legs_list, "Plantigrade")
|
||||
features["deco_wings"] = sanitize_inlist(features["deco_wings"], GLOB.deco_wings_list, "None")
|
||||
features["insect_fluff"] = sanitize_inlist(features["insect_fluff"], GLOB.insect_fluffs_list)
|
||||
@@ -1017,7 +1061,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
WRITE_FILE(S["feature_human_ears"] , features["ears"])
|
||||
WRITE_FILE(S["feature_lizard_frills"] , features["frills"])
|
||||
WRITE_FILE(S["feature_lizard_spines"] , features["spines"])
|
||||
WRITE_FILE(S["feature_lizard_body_markings"] , features["body_markings"])
|
||||
WRITE_FILE(S["feature_lizard_legs"] , features["legs"])
|
||||
WRITE_FILE(S["feature_deco_wings"] , features["deco_wings"])
|
||||
WRITE_FILE(S["feature_horns_color"] , features["horns_color"])
|
||||
|
||||
@@ -67,6 +67,7 @@
|
||||
H.dna.species.punchdamagehigh -= enhancement
|
||||
H.dna.species.punchdamagelow -= enhancement
|
||||
H.dna.species.punchwoundbonus -= wound_enhancement
|
||||
H.dna?.species?.attack_sound_override = null
|
||||
if(!silent)
|
||||
to_chat(user, "<span class='warning'>With [src] off of your arms, you feel less ready to punch things.</span>")
|
||||
|
||||
@@ -223,6 +224,46 @@
|
||||
parry_cooldown = 0
|
||||
parry_failed_clickcd_duration = 0
|
||||
|
||||
/obj/item/clothing/gloves/fingerless/pugilist/mauler
|
||||
name = "mauler gauntlets"
|
||||
desc = "Plastitanium gauntlets coated in a thick nano-weave carbon material and implanted with nanite injectors that boost the wielder's strength six-fold."
|
||||
icon_state = "mauler_gauntlets"
|
||||
item_state = "mauler_gauntlets"
|
||||
transfer_prints = FALSE
|
||||
body_parts_covered = ARMS|HANDS
|
||||
cold_protection = ARMS|HANDS
|
||||
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
|
||||
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
|
||||
armor = list("melee" = 30, "bullet" = 30, "laser" = 10, "energy" = 10, "bomb" = 55, "bio" = 15, "rad" = 15, "fire" = 80, "acid" = 50)
|
||||
siemens_coefficient = 0
|
||||
permeability_coefficient = 0.05
|
||||
strip_delay = 80
|
||||
enhancement = 12 // same as the changeling gauntlets but without changeling utility
|
||||
wound_enhancement = 12
|
||||
silent = TRUE
|
||||
inherited_trait = TRAIT_CHUNKYFINGERS // your fingers are fat because the gloves are
|
||||
secondary_trait = TRAIT_MAULER // commit table slam
|
||||
|
||||
/obj/item/clothing/gloves/fingerless/pugilist/mauler/equipped(mob/user, slot)
|
||||
. = ..()
|
||||
if(slot == SLOT_GLOVES)
|
||||
use_mauls(user, TRUE)
|
||||
wornonce = TRUE
|
||||
|
||||
/obj/item/clothing/gloves/fingerless/pugilist/mauler/dropped(mob/user)
|
||||
. = ..()
|
||||
if(wornonce)
|
||||
use_mauls(user, FALSE)
|
||||
wornonce = FALSE
|
||||
|
||||
/obj/item/clothing/gloves/fingerless/pugilist/mauler/proc/use_mauls(mob/user, maul)
|
||||
if(maul)
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
H.dna?.species?.attack_sound_override = 'sound/weapons/mauler_punch.ogg'
|
||||
if(silent)
|
||||
to_chat(H, "<span class='danger'>You feel prickles around your wrists as [src] cling to them - strength courses through your veins!</span>")
|
||||
|
||||
/obj/item/clothing/gloves/botanic_leather
|
||||
name = "botanist's leather gloves"
|
||||
desc = "These leather gloves protect against thorns, barbs, prickles, spikes and other harmful objects of floral origin. They're also quite warm."
|
||||
@@ -253,7 +294,6 @@
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 50)
|
||||
strip_mod = 1.5
|
||||
|
||||
|
||||
/obj/item/clothing/gloves/bracer
|
||||
name = "bone bracers"
|
||||
desc = "For when you're expecting to get slapped on the wrist. Offers modest protection to your arms."
|
||||
|
||||
@@ -89,10 +89,8 @@
|
||||
/datum/outfit/pirate/space
|
||||
suit = /obj/item/clothing/suit/space/pirate
|
||||
head = /obj/item/clothing/head/helmet/space/pirate/bandana
|
||||
mask = /obj/item/clothing/mask/breath
|
||||
suit_store = /obj/item/tank/internals/oxygen
|
||||
ears = /obj/item/radio/headset/syndicate
|
||||
id = /obj/item/card/id
|
||||
id = /obj/item/card/id/pirate
|
||||
|
||||
/datum/outfit/pirate/space/captain
|
||||
head = /obj/item/clothing/head/helmet/space/pirate
|
||||
|
||||
@@ -206,6 +206,7 @@
|
||||
icon_screen = "syndishuttle"
|
||||
icon_keyboard = "syndie_key"
|
||||
light_color = LIGHT_COLOR_RED
|
||||
req_access = list(ACCESS_SYNDICATE)
|
||||
possible_destinations = "pirateship_away;pirateship_home;pirateship_custom"
|
||||
|
||||
/obj/machinery/computer/camera_advanced/shuttle_docker/syndicate/pirate
|
||||
@@ -214,8 +215,8 @@
|
||||
shuttleId = "pirateship"
|
||||
lock_override = CAMERA_LOCK_STATION
|
||||
shuttlePortId = "pirateship_custom"
|
||||
x_offset = 9
|
||||
y_offset = 0
|
||||
x_offset = 11
|
||||
y_offset = 1
|
||||
see_hidden = FALSE
|
||||
|
||||
/obj/docking_port/mobile/pirate
|
||||
@@ -224,11 +225,7 @@
|
||||
rechargeTime = 3 MINUTES
|
||||
|
||||
/obj/machinery/suit_storage_unit/pirate
|
||||
suit_type = /obj/item/clothing/suit/space
|
||||
helmet_type = /obj/item/clothing/head/helmet/space
|
||||
mask_type = /obj/item/clothing/mask/breath
|
||||
storage_type = /obj/item/tank/jetpack/void
|
||||
// storage_type = /obj/item/tank/internals/oxygen
|
||||
storage_type = /obj/item/tank/jetpack/carbondioxide
|
||||
|
||||
/obj/machinery/loot_locator
|
||||
name = "Booty Locator"
|
||||
|
||||
@@ -17,24 +17,29 @@
|
||||
announceWhen = rand(4, 60)
|
||||
supernova = new
|
||||
SSsun.suns += supernova
|
||||
if(prob(20))
|
||||
power = rand(5,100) / 100
|
||||
else
|
||||
power = rand(5,5000) / 100
|
||||
switch(rand(1,5))
|
||||
if(1)
|
||||
power = rand(5,100) / 100
|
||||
if(2)
|
||||
power = rand(5,500) / 100
|
||||
if(3)
|
||||
power = rand(5,1000) / 100
|
||||
if(4, 5)
|
||||
power = rand(5,5000) / 100
|
||||
supernova.azimuth = rand(0, 359)
|
||||
supernova.power_mod = 0
|
||||
|
||||
/datum/round_event/supernova/announce()
|
||||
var/message = "Our tachyon-doppler array has detected a supernova in your vicinity. Peak flux from the supernova estimated to be [round(power,0.1)] times current solar flux. [power > 1 ? "Short burts of radiation may be possible, so please prepare accordingly." : ""]"
|
||||
var/message = "[station_name()]: Our tachyon-doppler array has detected a supernova in your vicinity. Peak flux from the supernova estimated to be [round(power,0.1)] times current solar flux; if the supernova is close to your sun in the sky, your solars may receive this as a power boost.[power > 1 ? " Short burts of radiation may be possible, so please prepare accordingly." : ""] We hope you enjoy the light."
|
||||
if(prob(power * 25))
|
||||
priority_announce(message)
|
||||
priority_announce(message, sender_override = "Nanotrasen Meteorology Division")
|
||||
else
|
||||
print_command_report(message)
|
||||
|
||||
|
||||
/datum/round_event/supernova/start()
|
||||
supernova.power_mod = 0.001 * power
|
||||
var/explosion_size = rand(1000000000, 999999999)
|
||||
var/explosion_size = rand(1000000000, 10000000000)
|
||||
var/turf/epicenter = get_turf_in_angle(supernova.azimuth, SSmapping.get_station_center(), round(world.maxx * 0.45))
|
||||
for(var/array in GLOB.doppler_arrays)
|
||||
var/obj/machinery/doppler_array/A = array
|
||||
@@ -51,13 +56,15 @@
|
||||
supernova.power_mod = min(supernova.power_mod*1.2, power)
|
||||
if(activeFor > endWhen-10)
|
||||
supernova.power_mod /= 4
|
||||
if(prob(round(supernova.power_mod)) && prob(5) && storm_count < 5 && !SSweather.get_weather_by_type(/datum/weather/rad_storm))
|
||||
if(prob(round(supernova.power_mod*2)) && prob(3) && storm_count < 5 && !SSweather.get_weather_by_type(/datum/weather/rad_storm))
|
||||
SSweather.run_weather(/datum/weather/rad_storm/supernova)
|
||||
storm_count++
|
||||
|
||||
/datum/round_event/supernova/end()
|
||||
SSsun.suns -= supernova
|
||||
qdel(supernova)
|
||||
priority_announce("The supernova's flux is now negligible. Radiation storms have ceased. Have a pleasant shift, [station_name()], and thank you for bearing with nature.",
|
||||
sender_override = "Nanotrasen Meteorology Division")
|
||||
|
||||
/datum/weather/rad_storm/supernova
|
||||
weather_duration_lower = 50
|
||||
|
||||
@@ -305,6 +305,15 @@
|
||||
/obj/item/reagent_containers/food/drinks/bottle/hcider/empty
|
||||
list_reagents = null
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/bottle/amaretto
|
||||
name = "Luini Amaretto"
|
||||
desc = "A gentle and syrup-like drink that tastes of almonds and apricots."
|
||||
icon_state = "disaronno"
|
||||
list_reagents = list(/datum/reagent/consumable/ethanol/amaretto = 100)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/bottle/amaretto/empty
|
||||
list_reagents = null
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/bottle/grappa
|
||||
name = "Phillipes well-aged Grappa"
|
||||
desc = "Bottle of Grappa."
|
||||
@@ -615,6 +624,10 @@
|
||||
icon_state = "hcider"
|
||||
name = "Sealed Cider"
|
||||
|
||||
/obj/item/export/bottle/amaretto
|
||||
icon_state = "disaronno"
|
||||
name = "Sealed Amaretto"
|
||||
|
||||
/obj/item/export/bottle/cognac
|
||||
icon_state = "cognacbottle"
|
||||
name = "Sealed Cognac"
|
||||
|
||||
@@ -26,6 +26,17 @@
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/flatdough/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/kitchen/unrollingpin))
|
||||
if(isturf(loc))
|
||||
new /obj/item/reagent_containers/food/snacks/dough(loc)
|
||||
to_chat(user, "<span class='notice'>You unflatten [src].</span>")
|
||||
qdel(src)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You need to put [src] on a surface to undo the rolling!</span>")
|
||||
else
|
||||
..()
|
||||
|
||||
|
||||
// sliceable into 3xdoughslices
|
||||
/obj/item/reagent_containers/food/snacks/flatdough
|
||||
@@ -98,6 +109,17 @@
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/piedough/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/kitchen/unrollingpin))
|
||||
if(isturf(loc))
|
||||
new /obj/item/reagent_containers/food/snacks/cakebatter(loc)
|
||||
to_chat(user, "<span class='notice'>You unflatten [src].</span>")
|
||||
qdel(src)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You need to put [src] on a surface to undo the rolling!</span>")
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/piedough
|
||||
name = "pie dough"
|
||||
desc = "Cook it to get a pie."
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
id = /datum/reagent/consumable/nuka_cola
|
||||
results = list(/datum/reagent/consumable/nuka_cola = 6)
|
||||
required_reagents = list(/datum/reagent/uranium = 1, /datum/reagent/consumable/space_cola = 6)
|
||||
mix_message = "The bitter-sweet smell of radiation almost makes you wish for a space winter."
|
||||
|
||||
/datum/chemical_reaction/moonshine
|
||||
name = "Moonshine"
|
||||
@@ -36,6 +37,7 @@
|
||||
results = list(/datum/reagent/consumable/ethanol/moonshine = 10)
|
||||
required_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/sugar = 5)
|
||||
required_catalysts = list(/datum/reagent/consumable/enzyme = 5)
|
||||
mix_message = "As the moisture in the glass settles, your entire face burns from the reaction's alcoholic virility."
|
||||
|
||||
/datum/chemical_reaction/wine
|
||||
name = "Wine"
|
||||
@@ -112,6 +114,7 @@
|
||||
id = /datum/reagent/consumable/ethanol/screwdrivercocktail
|
||||
results = list(/datum/reagent/consumable/ethanol/screwdrivercocktail = 3)
|
||||
required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 2, /datum/reagent/consumable/orangejuice = 1)
|
||||
mix_message = "The mixture billows a sweet scent of orange, promptly drowned out by a thick nose-scrunching cloud of potato liquor."
|
||||
|
||||
/datum/chemical_reaction/bloody_mary
|
||||
name = "Bloody Mary"
|
||||
@@ -142,18 +145,21 @@
|
||||
id = /datum/reagent/consumable/ethanol/toxins_special
|
||||
results = list(/datum/reagent/consumable/ethanol/toxins_special = 5)
|
||||
required_reagents = list(/datum/reagent/consumable/ethanol/rum = 2, /datum/reagent/consumable/ethanol/vermouth = 1, /datum/reagent/toxin/plasma = 2)
|
||||
mix_message = "The surface of the mixture sets ablaze as toxic gas erupts into a mystical cloud of fire, shortly settling to but a humble - albeit eternal blaze."
|
||||
|
||||
/datum/chemical_reaction/beepsky_smash
|
||||
name = "Beepksy Smash"
|
||||
id = /datum/reagent/consumable/ethanol/beepsky_smash
|
||||
results = list(/datum/reagent/consumable/ethanol/beepsky_smash = 5)
|
||||
required_reagents = list(/datum/reagent/consumable/limejuice = 2, /datum/reagent/consumable/ethanol/quadruple_sec = 2, /datum/reagent/iron = 1)
|
||||
mix_message = "You can hear the law nearby."
|
||||
|
||||
/datum/chemical_reaction/doctor_delight
|
||||
name = "The Doctor's Delight"
|
||||
id = /datum/reagent/consumable/doctor_delight
|
||||
results = list(/datum/reagent/consumable/doctor_delight = 5)
|
||||
required_reagents = list(/datum/reagent/consumable/limejuice = 1, /datum/reagent/consumable/tomatojuice = 1, /datum/reagent/consumable/orangejuice = 1, /datum/reagent/consumable/cream = 1, /datum/reagent/medicine/cryoxadone = 1)
|
||||
mix_message = "<span class='warning'>The scent of medicine hits you like a truck!</span>"
|
||||
|
||||
/datum/chemical_reaction/irish_cream
|
||||
name = "Irish Cream"
|
||||
@@ -166,6 +172,7 @@
|
||||
id = /datum/reagent/consumable/ethanol/manly_dorf
|
||||
results = list(/datum/reagent/consumable/ethanol/manly_dorf = 3)
|
||||
required_reagents = list (/datum/reagent/consumable/ethanol/beer = 1, /datum/reagent/consumable/ethanol/ale = 2)
|
||||
mix_message = "You can feel the hair growing on your chest!"
|
||||
|
||||
/datum/chemical_reaction/greenbeer
|
||||
name = "Green Beer"
|
||||
@@ -233,6 +240,7 @@
|
||||
id = /datum/reagent/consumable/ethanol/hiveminderaser
|
||||
results = list(/datum/reagent/consumable/ethanol/hiveminderaser = 4)
|
||||
required_reagents = list(/datum/reagent/consumable/ethanol/black_russian = 2, /datum/reagent/consumable/ethanol/thirteenloko = 1, /datum/reagent/consumable/grenadine = 1)
|
||||
mix_message = "Your head throbs as the purple-colored mixture swirls with alien-like vigor!"
|
||||
|
||||
/datum/chemical_reaction/manhattan
|
||||
name = "Manhattan"
|
||||
@@ -269,6 +277,8 @@
|
||||
id = /datum/reagent/consumable/ethanol/singulo
|
||||
results = list(/datum/reagent/consumable/ethanol/singulo = 10)
|
||||
required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 5, /datum/reagent/radium = 1, /datum/reagent/consumable/ethanol/wine = 5)
|
||||
mix_message = "<span class='warning'>A horrible screeching fills your ears, and a wave of dread washes over you...</span>"
|
||||
mix_sound = 'sound/effects/supermatter.ogg'
|
||||
|
||||
/datum/chemical_reaction/alliescocktail
|
||||
name = "Allies Cocktail"
|
||||
@@ -447,6 +457,8 @@
|
||||
id = /datum/reagent/consumable/ethanol/syndicatebomb
|
||||
results = list(/datum/reagent/consumable/ethanol/syndicatebomb = 2)
|
||||
required_reagents = list(/datum/reagent/consumable/ethanol/beer = 1, /datum/reagent/consumable/ethanol/whiskey_cola = 1)
|
||||
mix_message = "<span class='warning'>You can hear beeping coming from behind you.</span>"
|
||||
mix_sound = 'sound/items/timer.ogg'
|
||||
|
||||
/datum/chemical_reaction/erikasurprise
|
||||
name = "Erika Surprise"
|
||||
@@ -459,30 +471,38 @@
|
||||
id = /datum/reagent/consumable/ethanol/devilskiss
|
||||
results = list(/datum/reagent/consumable/ethanol/devilskiss = 3)
|
||||
required_reagents = list(/datum/reagent/blood = 1, /datum/reagent/consumable/ethanol/kahlua = 1, /datum/reagent/consumable/ethanol/rum = 1)
|
||||
mix_message = "You can hear faint whispering in your ear and a burning on your cheeks as the mixture blends together into with a fiery swirl."
|
||||
|
||||
/datum/chemical_reaction/hippiesdelight
|
||||
name = "Hippies Delight"
|
||||
id = /datum/reagent/consumable/ethanol/hippies_delight
|
||||
results = list(/datum/reagent/consumable/ethanol/hippies_delight = 2)
|
||||
required_reagents = list(/datum/reagent/drug/mushroomhallucinogen = 1, /datum/reagent/consumable/ethanol/gargle_blaster = 1)
|
||||
mix_message = "You can like... Smell the flowers, man - as the drink mixes."
|
||||
|
||||
/datum/chemical_reaction/bananahonk
|
||||
name = "Banana Honk"
|
||||
id = /datum/reagent/consumable/ethanol/bananahonk
|
||||
results = list(/datum/reagent/consumable/ethanol/bananahonk = 2)
|
||||
required_reagents = list(/datum/reagent/consumable/laughter = 1, /datum/reagent/consumable/cream = 1)
|
||||
mix_message = "The mixture honks. Honk!"
|
||||
mix_sound = 'sound/items/bikehorn.ogg'
|
||||
|
||||
/datum/chemical_reaction/silencer
|
||||
name = "Silencer"
|
||||
id = /datum/reagent/consumable/ethanol/silencer
|
||||
results = list(/datum/reagent/consumable/ethanol/silencer = 3)
|
||||
required_reagents = list(/datum/reagent/consumable/nothing = 1, /datum/reagent/consumable/cream = 1, /datum/reagent/consumable/sugar = 1)
|
||||
mix_message = "As the drink mixes, you can hear nothing..."
|
||||
mix_sound = null
|
||||
|
||||
/datum/chemical_reaction/driestmartini
|
||||
name = "Driest Martini"
|
||||
id = /datum/reagent/consumable/ethanol/driestmartini
|
||||
results = list(/datum/reagent/consumable/ethanol/driestmartini = 2)
|
||||
required_reagents = list(/datum/reagent/consumable/nothing = 1, /datum/reagent/consumable/ethanol/gin = 1)
|
||||
mix_message = "You feel like a prune beneath a sun as the mixture yanks the moisture from your tongue - yet, it's all so silent."
|
||||
mix_sound = null
|
||||
|
||||
/datum/chemical_reaction/thirteenloko
|
||||
name = "Thirteen Loko"
|
||||
@@ -519,12 +539,14 @@
|
||||
id = /datum/reagent/consumable/gibbfloats
|
||||
results = list(/datum/reagent/consumable/gibbfloats = 15)
|
||||
required_reagents = list(/datum/reagent/consumable/dr_gibb = 5, /datum/reagent/consumable/ice = 5, /datum/reagent/consumable/cream = 5)
|
||||
mix_message = "As the cream floats to the top of the glass, you can feel your cholesterol levels rising just looking at it."
|
||||
|
||||
/datum/chemical_reaction/triple_citrus
|
||||
name = "triple_citrus"
|
||||
id = /datum/reagent/consumable/triple_citrus
|
||||
results = list(/datum/reagent/consumable/triple_citrus = 5)
|
||||
required_reagents = list(/datum/reagent/consumable/lemonjuice = 1, /datum/reagent/consumable/limejuice = 1, /datum/reagent/consumable/orangejuice = 1)
|
||||
mix_message = "The glass's contents shift colors from a rainbow of fruity twinges before settling with a distinct flowery smell."
|
||||
|
||||
/datum/chemical_reaction/grape_soda
|
||||
name = "grape soda"
|
||||
@@ -567,6 +589,7 @@
|
||||
results = list(/datum/reagent/consumable/ethanol/bacchus_blessing = 4)
|
||||
required_reagents = list(/datum/reagent/consumable/ethanol/hooch = 1, /datum/reagent/consumable/ethanol/absinthe = 1, /datum/reagent/consumable/ethanol/manly_dorf = 1, /datum/reagent/consumable/ethanol/syndicatebomb = 1)
|
||||
mix_message = "<span class='warning'>The mixture turns to a sickening froth.</span>"
|
||||
mix_sound = 'sound/FermiChem/bufferadd.ogg'
|
||||
|
||||
/datum/chemical_reaction/lemonade
|
||||
name = "Lemonade"
|
||||
@@ -601,9 +624,17 @@
|
||||
id = /datum/reagent/consumable/ethanol/cogchamp
|
||||
results = list(/datum/reagent/consumable/ethanol/cogchamp = 3)
|
||||
required_reagents = list(/datum/reagent/consumable/ethanol/cognac = 1, /datum/reagent/fuel = 1, /datum/reagent/consumable/ethanol/screwdrivercocktail = 1)
|
||||
mix_message = "You hear faint sounds of gears turning as it mixes."
|
||||
mix_message = "You hear faint sounds of gears turning as the mixture gives off virulent plumes of steam."
|
||||
mix_sound = 'sound/machines/clockcult/steam_whoosh.ogg'
|
||||
|
||||
/datum/chemical_reaction/pinotmort
|
||||
name = "Pinot Mort"
|
||||
id = /datum/reagent/consumable/ethanol/pinotmort
|
||||
results = list(/datum/reagent/consumable/ethanol/pinotmort = 4)
|
||||
required_reagents = list(/datum/reagent/ash = 2, /datum/reagent/consumable/ethanol/lizardwine = 1, /datum/reagent/consumable/vitfro = 1)
|
||||
mix_message = "You hear an undescribable scream as it mixes... You're not sure how to feel about this."
|
||||
mix_sound = 'sound/effects/tendril_destroyed.ogg'
|
||||
|
||||
/datum/chemical_reaction/quadruplesec
|
||||
name = "Quadruple Sec"
|
||||
id = /datum/reagent/consumable/ethanol/quadruple_sec
|
||||
@@ -736,18 +767,22 @@
|
||||
id = /datum/reagent/consumable/pwr_game
|
||||
results = list(/datum/reagent/consumable/pwr_game = 5)
|
||||
required_reagents = list(/datum/reagent/consumable/sodawater = 1, /datum/reagent/colorful_reagent/crayonpowder/black = 1, /datum/reagent/consumable/sodiumchloride = 1)
|
||||
mix_message = "The mixture froths as it turns black, rousing a nauseating aroma of sweat and salt before settling to an eerie purple color."
|
||||
|
||||
/datum/chemical_reaction/pinkmilk
|
||||
name = "Strawberry Milk"
|
||||
id = /datum/reagent/consumable/pinkmilk
|
||||
results = list(/datum/reagent/consumable/pinkmilk = 2)
|
||||
required_reagents = list(/datum/reagent/consumable/strawberryjuice = 1, /datum/reagent/consumable/milk = 1)
|
||||
mix_message = "You feel a sweet aroma drift up your nose as the lactic mixture swirls. It reminds you of... a cafeteria."
|
||||
|
||||
/datum/chemical_reaction/blank_paper
|
||||
name = "Blank Paper"
|
||||
id = /datum/reagent/consumable/ethanol/blank_paper
|
||||
results = list(/datum/reagent/consumable/ethanol/blank_paper = 3)
|
||||
required_reagents = list(/datum/reagent/consumable/ethanol/silencer = 1, /datum/reagent/consumable/nothing = 1, /datum/reagent/consumable/nuka_cola = 1)
|
||||
mix_message = "As the drink mixes, you can hear nothing..."
|
||||
mix_sound = null
|
||||
|
||||
/datum/chemical_reaction/wizz_fizz
|
||||
name = "Wizz Fizz"
|
||||
@@ -777,18 +812,22 @@
|
||||
id = /datum/reagent/consumable/ethanol/turbo
|
||||
results = list(/datum/reagent/consumable/ethanol/turbo = 5)
|
||||
required_reagents = list(/datum/reagent/consumable/ethanol/moonshine = 2, /datum/reagent/nitrous_oxide = 1, /datum/reagent/consumable/ethanol/sugar_rush = 1, /datum/reagent/consumable/pwr_game = 1)
|
||||
mix_message = "The mixture pops and fizzles, it's going to bl- oh, nevermind."
|
||||
|
||||
/datum/chemical_reaction/old_timer
|
||||
name = "Old Timer"
|
||||
id = /datum/reagent/consumable/ethanol/old_timer
|
||||
results = list(/datum/reagent/consumable/ethanol/old_timer = 6)
|
||||
required_reagents = list(/datum/reagent/consumable/ethanol/whiskeysoda = 3, /datum/reagent/consumable/parsnipjuice = 2, /datum/reagent/consumable/ethanol/alexander = 1)
|
||||
mix_message = "You hear a faded record playing in the distance. Then, you hear nothing."
|
||||
mix_sound = null
|
||||
|
||||
/datum/chemical_reaction/rubberneck
|
||||
name = "Rubberneck"
|
||||
id = /datum/reagent/consumable/ethanol/rubberneck
|
||||
results = list(/datum/reagent/consumable/ethanol/rubberneck = 10)
|
||||
required_reagents = list(/datum/reagent/consumable/ethanol = 4, /datum/reagent/consumable/grey_bull = 5, /datum/reagent/consumable/astrotame = 1)
|
||||
mix_message = "The mixture boils and bubbles as the faint scent of rubber and heart disease hits your nose."
|
||||
|
||||
/datum/chemical_reaction/duplex
|
||||
name = "Duplex"
|
||||
@@ -801,6 +840,7 @@
|
||||
id = /datum/reagent/consumable/ethanol/trappist
|
||||
results = list(/datum/reagent/consumable/ethanol/trappist = 5)
|
||||
required_reagents = list(/datum/reagent/consumable/ethanol/ale = 2, /datum/reagent/water/holywater = 2, /datum/reagent/consumable/sugar = 1)
|
||||
mix_message = "As the mixture froths, you swear you can hear a distant holy choir."
|
||||
|
||||
/datum/chemical_reaction/cream_soda
|
||||
name = "Cream Soda"
|
||||
@@ -813,6 +853,8 @@
|
||||
id = /datum/reagent/consumable/ethanol/blazaam
|
||||
results = list(/datum/reagent/consumable/ethanol/blazaam = 3)
|
||||
required_reagents = list(/datum/reagent/consumable/ethanol/gin = 2, /datum/reagent/consumable/peachjuice = 1, /datum/reagent/bluespace = 1)
|
||||
mix_message = "The mixture- hey, where'd all the liquid go? Oh, there it is."
|
||||
mix_sound = 'sound/magic/Teleport_app.ogg'
|
||||
|
||||
/datum/chemical_reaction/planet_cracker
|
||||
name = "Planet Cracker"
|
||||
@@ -833,6 +875,7 @@
|
||||
results = list(/datum/reagent/consumable/ethanol/gunfire = 4)
|
||||
required_reagents = list(/datum/reagent/consumable/ethanol/rum = 1, /datum/reagent/consumable/tea = 3)
|
||||
mix_message = "A loud popping begins to fill the air as the drink is mixed."
|
||||
mix_sound = 'sound/effects/wounds/sizzle1.ogg'
|
||||
|
||||
/datum/chemical_reaction/hellfire
|
||||
name = "Hellfire"
|
||||
@@ -840,6 +883,7 @@
|
||||
results = list(/datum/reagent/consumable/ethanol/hellfire = 4)
|
||||
required_reagents = list(/datum/reagent/consumable/ethanol/rum = 2, /datum/reagent/consumable/ice = 1, /datum/reagent/consumable/ethanol/crevice_spike = 1)
|
||||
mix_message = "The liquid begins to churn as it changes to an amber orange and catches on fire."
|
||||
mix_sound = 'sound/FermiChem/bufferadd.ogg'
|
||||
|
||||
/datum/chemical_reaction/sins_delight
|
||||
name = "Sins Delight"
|
||||
@@ -853,6 +897,7 @@
|
||||
id = /datum/reagent/consumable/ethanol/strawberry_daiquiri
|
||||
results = list(/datum/reagent/consumable/ethanol/strawberry_daiquiri = 7)
|
||||
required_reagents = list(/datum/reagent/consumable/ethanol/rum = 2, /datum/reagent/consumable/limejuice = 1, /datum/reagent/consumable/sugar = 1, /datum/reagent/consumable/strawberryjuice = 2, /datum/reagent/consumable/ice = 1)
|
||||
mix_message = "The mixture settles as a nostril-flaring waft of strawberry hits your nose."
|
||||
|
||||
/datum/chemical_reaction/miami_vice
|
||||
name = "Miami Vice"
|
||||
@@ -871,18 +916,22 @@
|
||||
id = /datum/reagent/consumable/ethanol/liz_fizz
|
||||
results = list(/datum/reagent/consumable/ethanol/liz_fizz = 5)
|
||||
required_reagents = list(/datum/reagent/consumable/triple_citrus = 3, /datum/reagent/consumable/ice = 1, /datum/reagent/consumable/cream = 1)
|
||||
mix_message = "The smell of cream and lime hits your nose as everything feels very real for a split moment. You want to lick your eye."
|
||||
|
||||
/datum/chemical_reaction/hotlime_miami
|
||||
name = "Hotlime Miami"
|
||||
id = /datum/reagent/consumable/ethanol/hotlime_miami
|
||||
results = list(/datum/reagent/consumable/ethanol/hotlime_miami = 2)
|
||||
required_reagents = list(/datum/reagent/medicine/ephedrine = 1, /datum/reagent/consumable/ethanol/pina_colada = 1)
|
||||
mix_message = "<span class='warning'>You can hear synthwave in the distance as you can feel your blood boiling with rage.</span>"
|
||||
|
||||
/datum/chemical_reaction/mauna_loa
|
||||
name = "Mauna Loa"
|
||||
id = /datum/reagent/consumable/ethanol/mauna_loa
|
||||
results = list(/datum/reagent/consumable/ethanol/mauna_loa = 5)
|
||||
required_reagents = list(/datum/reagent/consumable/capsaicin = 2, /datum/reagent/consumable/ethanol/kahlua = 1, /datum/reagent/consumable/ethanol/bahama_mama = 2)
|
||||
mix_message = "The drink erupts as a plume of lava sprays all over the place! Oh, wait, it's just luke-warm liquor."
|
||||
mix_sound = 'sound/effects/wounds/sizzle2.ogg'
|
||||
|
||||
/datum/chemical_reaction/commander_and_chief
|
||||
name = "Commander and Chief"
|
||||
@@ -891,6 +940,22 @@
|
||||
required_reagents = list(/datum/reagent/consumable/ethanol/alliescocktail = 50, /datum/reagent/consumable/ethanol/champagne = 20, /datum/reagent/consumable/doctor_delight = 10, /datum/reagent/consumable/ethanol/quintuple_sec = 10, /datum/reagent/consumable/ethanol/screwdrivercocktail = 10)
|
||||
mix_message = "When your powers combine, I am Captain Pl-..."
|
||||
|
||||
/datum/chemical_reaction/godfather
|
||||
results = list(/datum/reagent/consumable/ethanol/godfather = 2)
|
||||
required_reagents = list(/datum/reagent/consumable/ethanol/amaretto = 1, /datum/reagent/consumable/ethanol/whiskey = 1)
|
||||
|
||||
/datum/chemical_reaction/godmother
|
||||
results = list(/datum/reagent/consumable/ethanol/godmother = 2)
|
||||
required_reagents = list(/datum/reagent/consumable/ethanol/amaretto = 1, /datum/reagent/consumable/ethanol/vodka = 1)
|
||||
|
||||
/datum/chemical_reaction/amaretto_alexander
|
||||
results = list(/datum/reagent/consumable/ethanol/amaretto_alexander = 3)
|
||||
required_reagents = list(/datum/reagent/consumable/ethanol/amaretto = 1, /datum/reagent/consumable/ethanol/creme_de_cacao = 1, /datum/reagent/consumable/cream = 1)
|
||||
|
||||
/datum/chemical_reaction/ginger_amaretto
|
||||
results = list(/datum/reagent/consumable/ethanol/ginger_amaretto = 4)
|
||||
required_reagents = list(/datum/reagent/consumable/ethanol/amaretto = 1, /datum/reagent/consumable/sol_dry = 1, /datum/reagent/consumable/ice = 1, /datum/reagent/consumable/lemonjuice = 1)
|
||||
|
||||
////////////////////////////////////////// Tea Base Drinks //////////////////////////////////////
|
||||
|
||||
/datum/chemical_reaction/mush
|
||||
@@ -898,6 +963,7 @@
|
||||
id = /datum/reagent/consumable/tea/mush
|
||||
results = list(/datum/reagent/consumable/tea/mush = 3)
|
||||
required_reagents = list(/datum/reagent/drug/mushroomhallucinogen = 3, /datum/reagent/consumable/tea = 3)
|
||||
mix_message = "The liquid stirs with a mixture of psychedelic colors that makes stars peek from the corner of your vision."
|
||||
|
||||
/datum/chemical_reaction/foresttea1
|
||||
name = "Forest Tea"
|
||||
@@ -959,7 +1025,7 @@
|
||||
id = /datum/reagent/consumable/catnip_tea
|
||||
results = list(/datum/reagent/consumable/catnip_tea = 3)
|
||||
required_reagents = list(/datum/reagent/consumable/tea = 5, /datum/reagent/pax/catnip = 2)
|
||||
|
||||
mix_message = "The mixture seems to purr aloud as it stirs together."
|
||||
|
||||
////////////////////////////////////////// Race Base Drinks //////////////////////////////////////
|
||||
|
||||
@@ -968,54 +1034,65 @@
|
||||
id = /datum/reagent/consumable/ethanol/species_drink/coldscales
|
||||
results = list(/datum/reagent/consumable/ethanol/species_drink/coldscales = 3)
|
||||
required_reagents = list(/datum/reagent/consumable/tea = 1, /datum/reagent/toxin/slimejelly = 1, /datum/reagent/consumable/menthol = 1)
|
||||
mix_message = "Bubbles erupt from the glass and spill all over the place as it mixes, before settling with the faint smell of a reptile enclosure."
|
||||
|
||||
/datum/chemical_reaction/oil_drum
|
||||
name = "Oil Drum"
|
||||
id = /datum/reagent/consumable/ethanol/species_drink/oil_drum
|
||||
results = list(/datum/reagent/consumable/ethanol/species_drink/oil_drum = 3)
|
||||
required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/oil = 1, /datum/reagent/consumable/ethanol/champagne = 12)
|
||||
mix_message = "You can taste oil in your mouth as the newly-formed mixture floats to the top of the glass."
|
||||
|
||||
/datum/chemical_reaction/nord_king
|
||||
name = "Nord King"
|
||||
id = /datum/reagent/consumable/ethanol/species_drink/nord_king
|
||||
results = list(/datum/reagent/consumable/ethanol/species_drink/nord_king = 10)
|
||||
required_reagents = list(/datum/reagent/consumable/ethanol = 5, /datum/reagent/consumable/honey = 1, /datum/reagent/consumable/ethanol/red_mead = 10)
|
||||
mix_message = "You can feel hair growing on places it shouldn't be as the smell of salt water and flame burns into your senses."
|
||||
|
||||
/datum/chemical_reaction/velvet_kiss
|
||||
name = "Velvet Kiss"
|
||||
id = /datum/reagent/consumable/ethanol/species_drink/velvet_kiss
|
||||
results = list(/datum/reagent/consumable/ethanol/species_drink/velvet_kiss = 15) //Limited races use this
|
||||
required_reagents = list(/datum/reagent/blood = 5, /datum/reagent/consumable/tea = 1, /datum/reagent/consumable/ethanol/wine = 10)
|
||||
mix_message = "The taste of blood rolls off your tongue as the mixture oozes a crimson secretion."
|
||||
|
||||
/datum/chemical_reaction/abduction_fruit
|
||||
name = "Abduction Fruit"
|
||||
id = /datum/reagent/consumable/ethanol/species_drink/abduction_fruit
|
||||
results = list(/datum/reagent/consumable/ethanol/species_drink/abduction_fruit = 3)
|
||||
required_reagents = list(/datum/reagent/consumable/limejuice = 10, /datum/reagent/consumable/strawberryjuice = 5, /datum/reagent/consumable/watermelonjuice = 10)
|
||||
mix_message = "The mixture forms with a green cloud of smoke, carrying with a smell of bovines and medicine."
|
||||
|
||||
/datum/chemical_reaction/bug_zapper
|
||||
name = "Bug Zapper"
|
||||
id = /datum/reagent/consumable/ethanol/species_drink/bug_zapper
|
||||
results = list(/datum/reagent/consumable/ethanol/species_drink/bug_zapper = 20) //Harder to make
|
||||
required_reagents = list(/datum/reagent/consumable/lemonjuice = 10, /datum/reagent/teslium = 1, /datum/reagent/copper = 10)
|
||||
mix_message = "The mixture comes to life with a spark and a zap - shortly after, you can hear the faint buzzing of moths circling your head."
|
||||
mix_sound = 'sound/weapons/taser.ogg'
|
||||
|
||||
/datum/chemical_reaction/mush_crush
|
||||
name = "Mush Crush"
|
||||
id = /datum/reagent/consumable/ethanol/species_drink/mush_crush
|
||||
results = list(/datum/reagent/consumable/ethanol/species_drink/mush_crush = 10)
|
||||
required_reagents = list(/datum/reagent/iron = 5, /datum/reagent/ash = 5, /datum/reagent/toxin/coffeepowder = 10)
|
||||
mix_message = "The mixture sputters and coughs as a mushroom suddenly emerges from the glass!"
|
||||
|
||||
/datum/chemical_reaction/darkbrew
|
||||
name = "Darkbrew"
|
||||
id = /datum/reagent/consumable/ethanol/species_drink/darkbrew
|
||||
results = list(/datum/reagent/consumable/ethanol/species_drink/darkbrew = 20)//Limited races use this
|
||||
required_reagents = list(/datum/reagent/liquid_dark_matter = 5, /datum/reagent/toxin/bungotoxin = 5, /datum/reagent/toxin/coffeepowder = 10)
|
||||
mix_message = "As the glass turns into a shadowy pit, you can smell... nothing."
|
||||
|
||||
/datum/chemical_reaction/hollow_bone
|
||||
name = "Hollow Bone"
|
||||
id = /datum/reagent/consumable/ethanol/species_drink/hollow_bone
|
||||
results = list(/datum/reagent/consumable/ethanol/species_drink/hollow_bone = 10)
|
||||
required_reagents = list(/datum/reagent/toxin/bonehurtingjuice = 5, /datum/reagent/consumable/milk = 10, /datum/reagent/consumable/coconutmilk = 10)
|
||||
mix_message = "<span class='warning'>Your bones feel weak.</span>"
|
||||
mix_sound = 'sound/effects/wounds/crack1.ogg'
|
||||
|
||||
/datum/chemical_reaction/frisky_kitty
|
||||
name = "Frisky Kitty"
|
||||
@@ -1023,6 +1100,7 @@
|
||||
results = list(/datum/reagent/consumable/ethanol/species_drink/frisky_kitty = 2)
|
||||
required_reagents = list(/datum/reagent/consumable/catnip_tea = 1, /datum/reagent/consumable/milk = 1)
|
||||
required_temp = 296 //Just above room temp (22.85'C)
|
||||
mix_message = "The drink bubbles over the rim as it settles, and the smell of wet fur and felines makes it feel like you're in heat."
|
||||
|
||||
/datum/chemical_reaction/jell_wyrm
|
||||
name = "Jell Wyrm"
|
||||
@@ -1030,6 +1108,7 @@
|
||||
results = list(/datum/reagent/consumable/ethanol/species_drink/jell_wyrm = 2)
|
||||
required_reagents = list(/datum/reagent/toxin/slimejelly = 1, /datum/reagent/toxin/carpotoxin = 1, /datum/reagent/carbondioxide = 5)
|
||||
required_temp = 333 // (59.85'C)
|
||||
mix_message = "The smell of toxins scrunches your nose as your limbs grow limp and feel like jelly."
|
||||
|
||||
/datum/chemical_reaction/laval_spit
|
||||
name = "Laval Spit"
|
||||
@@ -1037,3 +1116,5 @@
|
||||
results = list(/datum/reagent/consumable/ethanol/species_drink/laval_spit = 20) //Limited use
|
||||
required_reagents = list(/datum/reagent/iron = 5, /datum/reagent/consumable/ethanol/mauna_loa = 10, /datum/reagent/sulfur = 5)
|
||||
required_temp = 900 // (626.85'C)
|
||||
mix_message = "The room grows warm as burning rock rockets over the edge of the drink before settling."
|
||||
mix_sound = 'sound/effects/wounds/sizzle2.ogg'
|
||||
|
||||
@@ -3,6 +3,15 @@
|
||||
|
||||
////////////////////////////////////////////////BREAD////////////////////////////////////////////////
|
||||
|
||||
/datum/crafting_recipe/food/bread
|
||||
name = "Bread"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/breadslice/plain = 5,
|
||||
)
|
||||
tools = list(/obj/item/kitchen/efink)
|
||||
result = /obj/item/reagent_containers/food/snacks/store/bread/plain
|
||||
subcategory = CAT_BREAD
|
||||
|
||||
/datum/crafting_recipe/food/banananutbread
|
||||
name = "Banana nut bread"
|
||||
reqs = list(
|
||||
|
||||
@@ -66,6 +66,16 @@
|
||||
|
||||
////////////////////////////////////////////////MISC RECIPE's////////////////////////////////////////////////
|
||||
|
||||
/datum/crafting_recipe/food/meatslab
|
||||
name = "Meat Slab"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/meat/rawcutlet = 3,
|
||||
)
|
||||
tools = list(/obj/item/kitchen/efink)
|
||||
result = /obj/item/reagent_containers/food/snacks/meat/slab
|
||||
subcategory = CAT_MEAT
|
||||
|
||||
|
||||
/datum/crafting_recipe/food/ribs
|
||||
name = "BBQ Ribs"
|
||||
reqs = list(
|
||||
|
||||
@@ -47,6 +47,24 @@
|
||||
|
||||
/////////////////////////////////MISC/////////////////////////////////////
|
||||
|
||||
/datum/crafting_recipe/food/dough
|
||||
name = "Dough"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/doughslice = 3,
|
||||
)
|
||||
tools = list(/obj/item/kitchen/efink)
|
||||
result = /obj/item/reagent_containers/food/snacks/flatdough
|
||||
subcategory = CAT_MISCFOOD
|
||||
|
||||
/datum/crafting_recipe/food/Pineapple
|
||||
name = "Pineapple"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/pineappleslice = 3,
|
||||
)
|
||||
tools = list(/obj/item/kitchen/efink)
|
||||
result = /obj/item/reagent_containers/food/snacks/grown/pineapple
|
||||
subcategory = CAT_MISCFOOD
|
||||
|
||||
/datum/crafting_recipe/food/beans
|
||||
name = "Beans"
|
||||
time = 40
|
||||
|
||||
@@ -194,6 +194,15 @@
|
||||
|
||||
////////////////////////////////////////////OTHER////////////////////////////////////////////
|
||||
|
||||
/datum/crafting_recipe/food/piedough
|
||||
name = "Pie Dough"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/rawpastrybase = 3,
|
||||
)
|
||||
tools = list(/obj/item/kitchen/efink)
|
||||
result = /obj/item/reagent_containers/food/snacks/piedough
|
||||
subcategory = CAT_PASTRY
|
||||
|
||||
/datum/crafting_recipe/food/chococornet
|
||||
name = "Choco cornet"
|
||||
reqs = list(
|
||||
|
||||
@@ -206,6 +206,9 @@
|
||||
/mob/living/simple_animal/hostile/retaliate/clown/insane/ex_act()
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/clown/insane/wave_ex_act(power, datum/wave_explosion/explosion, dir)
|
||||
return power
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/clown/insane/Life()
|
||||
timer--
|
||||
if(target)
|
||||
|
||||
@@ -152,7 +152,7 @@
|
||||
var/newcolor = copytext_char(hash, 1, 7)
|
||||
add_atom_colour("#[newcolor]", FIXED_COLOUR_PRIORITY)
|
||||
light_color = "#[newcolor]"
|
||||
set_light(1)
|
||||
set_light(0.3)
|
||||
|
||||
/obj/structure/chisel_message/proc/pack()
|
||||
var/list/data = list()
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
layer = LIGHTING_LAYER
|
||||
invisibility = INVISIBILITY_LIGHTING
|
||||
vis_flags = VIS_HIDE
|
||||
|
||||
var/needs_update = FALSE
|
||||
var/turf/myturf
|
||||
|
||||
@@ -13,13 +13,15 @@
|
||||
var/offset
|
||||
while((offset = SSmapping.level_trait(other_z, ZTRAIT_DOWN)))
|
||||
other_z += offset
|
||||
if(other_z in .)
|
||||
break // no infinite loops
|
||||
. += other_z
|
||||
other_z = center_z
|
||||
while((offset = SSmapping.level_trait(other_z, ZTRAIT_UP)))
|
||||
other_z += offset
|
||||
if(other_z in .)
|
||||
break // no infinite loops
|
||||
. += other_z
|
||||
return .
|
||||
|
||||
|
||||
/proc/get_dir_multiz(turf/us, turf/them)
|
||||
us = get_turf(us)
|
||||
@@ -46,4 +48,4 @@
|
||||
|
||||
/turf/proc/below()
|
||||
return get_step_multiz(src, DOWN)
|
||||
|
||||
|
||||
|
||||
@@ -8,6 +8,10 @@
|
||||
area_flags = BLOBS_ALLOWED | UNIQUE_AREA
|
||||
flags_1 = CAN_BE_DIRTY_1
|
||||
|
||||
/area/survivalpod/nonpowered
|
||||
name = "\proper Emergency Shelter"
|
||||
requires_power = TRUE
|
||||
|
||||
//Survival Capsule
|
||||
/obj/item/survivalcapsule
|
||||
name = "bluespace shelter capsule"
|
||||
@@ -81,6 +85,10 @@
|
||||
desc = "A luxury bar in a capsule. Bartender required and not included."
|
||||
template_id = "shelter_charlie"
|
||||
|
||||
/obj/item/survivalcapsule/luxury/empty
|
||||
name = "large empty capsule"
|
||||
desc = "An extremly large capsule which requires power. Useful for projects all over."
|
||||
template_id = "shelter_delta"
|
||||
//Pod objects
|
||||
|
||||
//Window
|
||||
|
||||
@@ -994,7 +994,6 @@
|
||||
H.dna.features["wings"] = "None"
|
||||
H.dna.features["frills"] = "None"
|
||||
H.dna.features["spines"] = "Long"
|
||||
H.dna.features["body_markings"] = "Dark Tiger Body"
|
||||
H.dna.features["legs"] = "Digitigrade"
|
||||
H.dna.features["taur_body"] = "None"
|
||||
H.left_eye_color = "fee5a3"
|
||||
|
||||
@@ -56,6 +56,7 @@
|
||||
new /datum/data/mining_equipment("Ice hiking boots", /obj/item/clothing/shoes/winterboots/ice_boots, 2500),
|
||||
new /datum/data/mining_equipment("Luxury Shelter Capsule", /obj/item/survivalcapsule/luxury, 3000),
|
||||
new /datum/data/mining_equipment("Luxury Bar Capsule", /obj/item/survivalcapsule/luxury/elitebar, 10000),
|
||||
new /datum/data/mining_equipment("Empty Capsule", /obj/item/survivalcapsule/luxury/empty, 5000),
|
||||
new /datum/data/mining_equipment("Nanotrasen Minebot", /mob/living/simple_animal/hostile/mining_drone, 800),
|
||||
new /datum/data/mining_equipment("Minebot Melee Upgrade", /obj/item/mine_bot_upgrade, 400),
|
||||
new /datum/data/mining_equipment("Minebot Armor Upgrade", /obj/item/mine_bot_upgrade/health, 400),
|
||||
|
||||
@@ -73,3 +73,15 @@
|
||||
. = ..()
|
||||
whitelisted_turfs = typecacheof(/turf/closed/mineral)
|
||||
banned_objects = typecacheof(/obj/structure/stone_tile)
|
||||
|
||||
/datum/map_template/shelter/delta
|
||||
name = "Shelter Delta"
|
||||
shelter_id = "shelter_delta"
|
||||
description = "A massive but barebones survival capsule useful\
|
||||
for projects that require great deals of space."
|
||||
mappath = "_maps/templates/shelter_4.dmm"
|
||||
|
||||
/datum/map_template/shelter/delta/New()
|
||||
. = ..()
|
||||
whitelisted_turfs = typecacheof(/turf/closed/mineral)
|
||||
banned_objects = typecacheof(/obj/structure/stone_tile)
|
||||
|
||||
@@ -54,6 +54,8 @@
|
||||
mannequin.job = previewJob.title
|
||||
previewJob.equip(mannequin, TRUE, preference_source = parent)
|
||||
|
||||
mannequin.regenerate_icons()
|
||||
|
||||
COMPILE_OVERLAYS(mannequin)
|
||||
parent.show_character_previews(new /mutable_appearance(mannequin))
|
||||
unset_busy_human_dummy(DUMMY_HUMAN_SLOT_PREFERENCES)
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
name = "DataShark"
|
||||
icon_state = "datashark"
|
||||
ckeys_allowed = list("rubyflamewing")
|
||||
covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_GREEN, "Left Leg" = MATRIX_GREEN, "Right Leg" = MATRIX_GREEN, "Left Arm" = MATRIX_GREEN, "Right Arm" = MATRIX_GREEN)
|
||||
|
||||
//Sabresune
|
||||
/datum/sprite_accessory/ears/mam_ears/sabresune
|
||||
@@ -39,6 +40,7 @@
|
||||
name = "Sabresune"
|
||||
icon_state = "sabresune"
|
||||
ckeys_allowed = list("poojawa")
|
||||
covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_RED_GREEN, "Right Leg" = MATRIX_RED_GREEN, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN)
|
||||
|
||||
//Lunasune
|
||||
/datum/sprite_accessory/ears/mam_ears/lunasune
|
||||
|
||||
@@ -1,39 +1,3 @@
|
||||
/******************************************
|
||||
************* Lizard Markings *************
|
||||
*******************************************/
|
||||
|
||||
/datum/sprite_accessory/body_markings
|
||||
icon = 'icons/mob/mutant_bodyparts.dmi'
|
||||
relevant_layers = list(BODY_ADJ_LAYER)
|
||||
mutant_part_string = "body_markings"
|
||||
|
||||
/datum/sprite_accessory/body_markings/none
|
||||
name = "None"
|
||||
icon_state = "none"
|
||||
relevant_layers = null
|
||||
|
||||
/datum/sprite_accessory/body_markings/dtiger
|
||||
name = "Dark Tiger Body"
|
||||
icon_state = "dtiger"
|
||||
gender_specific = 1
|
||||
|
||||
/datum/sprite_accessory/body_markings/guilmon
|
||||
name = "Guilmon"
|
||||
icon_state = "guilmon"
|
||||
color_src = MATRIXED
|
||||
icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
|
||||
matrixed_sections = MATRIX_ALL
|
||||
|
||||
/datum/sprite_accessory/body_markings/ltiger
|
||||
name = "Light Tiger Body"
|
||||
icon_state = "ltiger"
|
||||
gender_specific = 1
|
||||
|
||||
/datum/sprite_accessory/body_markings/lbelly
|
||||
name = "Light Belly"
|
||||
icon_state = "lbelly"
|
||||
gender_specific = 1
|
||||
|
||||
/******************************************
|
||||
************ Furry Markings ***************
|
||||
*******************************************/
|
||||
@@ -49,7 +13,8 @@
|
||||
gender_specific = 0
|
||||
icon = 'modular_citadel/icons/mob/mam_markings.dmi'
|
||||
recommended_species = list("mammal", "xeno", "slimeperson", "podweak")
|
||||
matrixed_sections = MATRIX_ALL
|
||||
matrixed_sections = MATRIX_ALL // this value is used if there is no value in covered_limbs, don't rely on it, it's a backup value
|
||||
var/list/covered_limbs = list("Head", "Chest", "Left Leg", "Right Leg", "Left Arm", "Right Arm")
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/none
|
||||
name = "None"
|
||||
@@ -62,87 +27,107 @@
|
||||
/datum/sprite_accessory/mam_body_markings/redpanda
|
||||
name = "Redpanda"
|
||||
icon_state = "redpanda"
|
||||
covered_limbs = list("Head" = MATRIX_RED_BLUE, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_RED_GREEN, "Right Leg" = MATRIX_RED_GREEN, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN)
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/bat
|
||||
name = "Bat"
|
||||
icon_state = "bat"
|
||||
covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_ALL, "Left Leg" = MATRIX_RED_BLUE, "Right Leg" = MATRIX_RED_BLUE, "Left Arm" = MATRIX_RED, "Right Arm" = MATRIX_RED)
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/bee
|
||||
name = "Bee"
|
||||
icon_state = "bee"
|
||||
icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
|
||||
covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_GREEN, "Left Leg" = MATRIX_GREEN, "Right Leg" = MATRIX_GREEN, "Left Arm" = MATRIX_GREEN, "Right Arm" = MATRIX_GREEN)
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/belly
|
||||
name = "Belly"
|
||||
icon_state = "belly"
|
||||
icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
|
||||
covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_GREEN, "Left Leg" = MATRIX_RED, "Right Leg" = MATRIX_RED)
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/bellyslim
|
||||
name = "Bellyslim"
|
||||
icon_state = "bellyslim"
|
||||
icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
|
||||
covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_RED, "Right Leg" = MATRIX_RED, "Left Arm" = MATRIX_RED, "Right Arm" = MATRIX_RED)
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/cow
|
||||
name = "Bovine"
|
||||
icon_state = "bovine"
|
||||
covered_limbs = list("Head" = MATRIX_ALL, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_ALL, "Right Leg" = MATRIX_ALL, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN)
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/corgi
|
||||
name = "Corgi"
|
||||
icon_state = "corgi"
|
||||
covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_RED_GREEN, "Right Leg" = MATRIX_RED_GREEN, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN)
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/corvid
|
||||
name = "Corvid"
|
||||
icon_state = "corvid"
|
||||
covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_ALL, "Right Leg" = MATRIX_ALL, "Left Arm" = MATRIX_RED, "Right Arm" = MATRIX_RED)
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/dalmation
|
||||
name = "Dalmation"
|
||||
icon_state = "dalmation"
|
||||
covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_RED_GREEN, "Right Leg" = MATRIX_RED_GREEN, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN)
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/deer
|
||||
name = "Deer"
|
||||
icon_state = "deer"
|
||||
covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_GREEN_BLUE, "Right Leg" = MATRIX_GREEN_BLUE, "Left Arm" = MATRIX_GREEN, "Right Arm" = MATRIX_GREEN)
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/dog
|
||||
name = "Dog"
|
||||
icon_state = "dog"
|
||||
covered_limbs = list("Head" = MATRIX_RED_BLUE, "Chest" = MATRIX_ALL, "Left Leg" = MATRIX_GREEN_BLUE, "Right Leg" = MATRIX_GREEN_BLUE, "Left Arm" = MATRIX_ALL, "Right Arm" = MATRIX_ALL)
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/eevee
|
||||
name = "Eevee"
|
||||
icon_state = "eevee"
|
||||
covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_GREEN)
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/fennec
|
||||
name = "Fennec"
|
||||
icon_state = "Fennec"
|
||||
covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_RED_GREEN, "Right Leg" = MATRIX_RED_GREEN, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN)
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/fox
|
||||
name = "Fox"
|
||||
icon_state = "fox"
|
||||
covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_ALL, "Right Leg" = MATRIX_ALL, "Left Arm" = MATRIX_RED_BLUE, "Right Arm" = MATRIX_RED_BLUE)
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/frog
|
||||
name = "Frog"
|
||||
icon_state = "frog"
|
||||
icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
|
||||
covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_GREEN, "Left Leg" = MATRIX_GREEN, "Right Leg" = MATRIX_GREEN, "Left Arm" = MATRIX_GREEN, "Right Arm" = MATRIX_GREEN)
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/goat
|
||||
name = "Goat"
|
||||
icon_state = "goat"
|
||||
covered_limbs = list("Head" = MATRIX_RED, "Chest" = MATRIX_RED, "Left Leg" = MATRIX_RED_BLUE, "Right Leg" = MATRIX_RED_BLUE, "Left Arm" = MATRIX_RED_BLUE, "Right Arm" = MATRIX_RED_BLUE)
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/handsfeet
|
||||
name = "Handsfeet"
|
||||
icon_state = "handsfeet"
|
||||
icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
|
||||
covered_limbs = list("Head" = MATRIX_RED, "Chest" = MATRIX_RED, "Left Leg" = MATRIX_RED_GREEN, "Right Leg" = MATRIX_RED_GREEN, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN)
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/hawk
|
||||
name = "Hawk"
|
||||
icon_state = "hawk"
|
||||
covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_ALL, "Right Leg" = MATRIX_ALL, "Left Arm" = MATRIX_RED, "Right Arm" = MATRIX_RED)
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/husky
|
||||
name = "Husky"
|
||||
icon_state = "husky"
|
||||
covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_ALL, "Right Leg" = MATRIX_ALL, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN)
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/hyena
|
||||
name = "Hyena"
|
||||
icon_state = "hyena"
|
||||
covered_limbs = list("Head" = MATRIX_ALL, "Chest" = MATRIX_ALL, "Left Leg" = MATRIX_RED_GREEN, "Right Leg" = MATRIX_RED_GREEN, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN)
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/insect
|
||||
name = "Insect"
|
||||
@@ -152,78 +137,118 @@
|
||||
/datum/sprite_accessory/mam_body_markings/lab
|
||||
name = "Lab"
|
||||
icon_state = "lab"
|
||||
covered_limbs = list("Head" = MATRIX_RED, "Chest" = MATRIX_RED, "Left Leg" = MATRIX_RED, "Right Leg" = MATRIX_RED, "Left Arm" = MATRIX_RED, "Right Arm" = MATRIX_RED)
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/orca
|
||||
name = "Orca"
|
||||
icon_state = "orca"
|
||||
covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_RED_GREEN, "Right Leg" = MATRIX_RED_GREEN, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN)
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/otie
|
||||
name = "Otie"
|
||||
icon_state = "otie"
|
||||
covered_limbs = list("Head" = MATRIX_ALL, "Chest" = MATRIX_ALL, "Left Leg" = MATRIX_ALL, "Right Leg" = MATRIX_ALL, "Left Arm" = MATRIX_ALL, "Right Arm" = MATRIX_ALL)
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/otter
|
||||
name = "Otter"
|
||||
icon_state = "otter"
|
||||
covered_limbs = list("Head" = MATRIX_ALL, "Chest" = MATRIX_GREEN)
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/panther
|
||||
name = "Panther"
|
||||
icon_state = "panther"
|
||||
covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_RED_GREEN, "Right Leg" = MATRIX_RED_GREEN, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN)
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/plain
|
||||
name = "Plain"
|
||||
icon_state = "plain"
|
||||
icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
|
||||
covered_limbs = list("Head" = MATRIX_RED, "Chest" = MATRIX_RED, "Left Leg" = MATRIX_RED, "Right Leg" = MATRIX_RED, "Left Arm" = MATRIX_RED, "Right Arm" = MATRIX_RED)
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/possum
|
||||
name = "Possum"
|
||||
icon_state = "possum"
|
||||
covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_RED_BLUE, "Right Leg" = MATRIX_RED_BLUE, "Left Arm" = MATRIX_RED_BLUE, "Right Arm" = MATRIX_RED_BLUE)
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/raccoon
|
||||
name = "Raccoon"
|
||||
icon_state = "raccoon"
|
||||
covered_limbs = list("Head" = MATRIX_ALL, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_ALL, "Right Leg" = MATRIX_ALL, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN)
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/sergal
|
||||
name = "Sergal"
|
||||
icon_state = "sergal"
|
||||
covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN)
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/pede
|
||||
name = "Scolipede"
|
||||
icon_state = "scolipede"
|
||||
icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
|
||||
covered_limbs = list("Head" = MATRIX_GREEN, "Chest" = MATRIX_GREEN_BLUE, "Left Leg" = MATRIX_GREEN, "Right Leg" = MATRIX_GREEN, "Left Arm" = MATRIX_GREEN, "Right Arm" = MATRIX_GREEN)
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/shark
|
||||
name = "Shark"
|
||||
icon_state = "shark"
|
||||
covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED, "Left Leg" = MATRIX_RED, "Right Leg" = MATRIX_RED_GREEN, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN)
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/shepherd
|
||||
name = "Shepherd"
|
||||
icon_state = "shepherd"
|
||||
covered_limbs = list("Head" = MATRIX_ALL, "Chest" = MATRIX_ALL, "Left Leg" = MATRIX_RED_GREEN, "Right Leg" = MATRIX_RED_GREEN, "Left Arm" = MATRIX_RED, "Right Arm" = MATRIX_RED)
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/skunk
|
||||
name = "Skunk"
|
||||
icon_state = "skunk"
|
||||
covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_RED_GREEN, "Right Leg" = MATRIX_RED_GREEN, "Left Arm" = MATRIX_RED, "Right Arm" = MATRIX_RED)
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/tajaran
|
||||
name = "Tajaran"
|
||||
icon_state = "tajaran"
|
||||
covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_RED, "Right Leg" = MATRIX_RED, "Left Arm" = MATRIX_RED, "Right Arm" = MATRIX_RED)
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/tiger
|
||||
name = "Tiger"
|
||||
icon_state = "tiger"
|
||||
covered_limbs = list("Head" = MATRIX_ALL, "Chest" = MATRIX_ALL, "Left Leg" = MATRIX_ALL, "Right Leg" = MATRIX_ALL, "Left Arm" = MATRIX_RED_BLUE, "Right Arm" = MATRIX_RED_BLUE)
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/turian
|
||||
name = "Turian"
|
||||
icon_state = "turian"
|
||||
icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
|
||||
covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED, "Left Leg" = MATRIX_RED, "Right Leg" = MATRIX_RED, "Left Arm" = MATRIX_RED, "Right Arm" = MATRIX_RED)
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/wolf
|
||||
name = "Wolf"
|
||||
icon_state = "wolf"
|
||||
covered_limbs = list("Head" = MATRIX_ALL, "Chest" = MATRIX_ALL, "Left Leg" = MATRIX_RED_BLUE, "Right Leg" = MATRIX_RED_BLUE, "Left Arm" = MATRIX_RED_BLUE, "Right Arm" = MATRIX_RED_BLUE)
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/xeno
|
||||
name = "Xeno"
|
||||
icon_state = "xeno"
|
||||
icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
|
||||
covered_limbs = list("Head" = MATRIX_BLUE, "Chest" = MATRIX_GREEN, "Left Leg" = MATRIX_GREEN, "Right Leg" = MATRIX_GREEN, "Left Arm" = MATRIX_GREEN, "Right Arm" = MATRIX_GREEN)
|
||||
|
||||
// sticking old lizard markings here for now
|
||||
/datum/sprite_accessory/mam_body_markings/dtiger
|
||||
name = "Dark Tiger Body"
|
||||
icon_state = "dtiger"
|
||||
covered_limbs = list("Head" = MATRIX_RED, "Chest" = MATRIX_RED, "Left Leg" = MATRIX_RED, "Right Leg" = MATRIX_RED, "Left Arm" = MATRIX_RED, "Right Arm" = MATRIX_RED)
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/guilmon
|
||||
name = "Guilmon"
|
||||
icon_state = "guilmon"
|
||||
icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
|
||||
covered_limbs = list("Head" = MATRIX_RED_BLUE, "Chest" = MATRIX_GREEN_BLUE, "Left Leg" = MATRIX_BLUE, "Right Leg" = MATRIX_BLUE, "Left Arm" = MATRIX_GREEN_BLUE, "Right Arm" = MATRIX_GREEN_BLUE)
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/ltiger
|
||||
name = "Light Tiger Body"
|
||||
icon_state = "ltiger"
|
||||
covered_limbs = list("Head" = MATRIX_RED, "Chest" = MATRIX_RED, "Left Leg" = MATRIX_RED, "Right Leg" = MATRIX_RED, "Left Arm" = MATRIX_RED, "Right Arm" = MATRIX_RED)
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/lbelly
|
||||
name = "Light Belly"
|
||||
icon_state = "lbelly"
|
||||
covered_limbs = list("Head" = MATRIX_RED, "Chest" = MATRIX_RED, "Left Leg" = MATRIX_RED, "Right Leg" = MATRIX_RED, "Left Arm" = MATRIX_RED, "Right Arm" = MATRIX_RED)
|
||||
|
||||
/******************************************
|
||||
************* Insect Markings *************
|
||||
|
||||
@@ -67,6 +67,13 @@
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
|
||||
|
||||
/datum/sprite_accessory/ears/bunnyalt
|
||||
name = "Bunny (Vegas)"
|
||||
icon_state = "bunnyalt"
|
||||
color_src = MATRIXED
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
|
||||
|
||||
/datum/sprite_accessory/ears/cat
|
||||
name = "Cat"
|
||||
icon_state = "cat"
|
||||
@@ -155,12 +162,19 @@
|
||||
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
|
||||
|
||||
/datum/sprite_accessory/ears/human/rabbit
|
||||
name = "Rabbit"
|
||||
name = "Rabbit (Lop-eared)"
|
||||
icon_state = "rabbit"
|
||||
color_src = MATRIXED
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
|
||||
|
||||
/datum/sprite_accessory/ears/human/rabbitalt
|
||||
name = "Rabbit (Straight-eared)"
|
||||
icon_state = "rabbitalt"
|
||||
color_src = MATRIXED
|
||||
matrixed_sections = MATRIX_ALL
|
||||
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
|
||||
|
||||
/datum/sprite_accessory/ears/human/pede
|
||||
name = "Scolipede"
|
||||
icon_state = "pede"
|
||||
@@ -258,6 +272,11 @@
|
||||
icon_state = "bunny"
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
|
||||
/datum/sprite_accessory/ears/mam_ears/bunnyalt
|
||||
name = "Bunny (Vegas)"
|
||||
icon_state = "bunnyalt"
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
|
||||
/datum/sprite_accessory/ears/mam_ears/cat
|
||||
name = "Cat"
|
||||
icon_state = "cat"
|
||||
@@ -284,7 +303,7 @@
|
||||
/datum/sprite_accessory/ears/mam_ears/deer
|
||||
name = "Deer"
|
||||
icon_state = "deer"
|
||||
color_src = MUTCOLORS3
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
|
||||
/datum/sprite_accessory/ears/mam_ears/eevee
|
||||
name = "Eevee"
|
||||
@@ -347,10 +366,15 @@
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
|
||||
/datum/sprite_accessory/ears/mam_ears/rabbit
|
||||
name = "Rabbit"
|
||||
name = "Rabbit (Lop-eared)"
|
||||
icon_state = "rabbit"
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
|
||||
/datum/sprite_accessory/ears/mam_ears/rabbitalt
|
||||
name = "Rabbit (Straight-eared)"
|
||||
icon_state = "rabbitalt"
|
||||
matrixed_sections = MATRIX_ALL
|
||||
|
||||
/datum/sprite_accessory/ears/mam_ears/pede
|
||||
name = "Scolipede"
|
||||
icon_state = "pede"
|
||||
|
||||
@@ -17,6 +17,10 @@
|
||||
name = "Adhara"
|
||||
icon_state = "hair_adhara"
|
||||
|
||||
/datum/sprite_accessory/hair/africanpigtails
|
||||
name = "African Pig Tails"
|
||||
icon_state = "hair_africanpigtails"
|
||||
|
||||
/datum/sprite_accessory/hair/afro
|
||||
name = "Afro"
|
||||
icon_state = "hair_afro"
|
||||
@@ -25,10 +29,26 @@
|
||||
name = "Afro 2"
|
||||
icon_state = "hair_afro2"
|
||||
|
||||
/datum/sprite_accessory/hair/afro2alt
|
||||
name = "Afro 2 (Alt)"
|
||||
icon_state = "hair_afro2alt"
|
||||
|
||||
/datum/sprite_accessory/hair/afro_large
|
||||
name = "Afro (Large)"
|
||||
icon_state = "hair_bigafro"
|
||||
|
||||
/datum/sprite_accessory/hair/afropuffdouble
|
||||
name = "Afropuff (Double)"
|
||||
icon_state = "hair_afropuffdouble"
|
||||
|
||||
/datum/sprite_accessory/hair/afropuffleft
|
||||
name = "Afropuff (Left)"
|
||||
icon_state = "hair_afropuffleft"
|
||||
|
||||
/datum/sprite_accessory/hair/afropuffright
|
||||
name = "Afropuff (Right)"
|
||||
icon_state = "hair_afropuffright"
|
||||
|
||||
/datum/sprite_accessory/hair/antenna
|
||||
name = "Ahoge"
|
||||
icon_state = "hair_antenna"
|
||||
@@ -41,10 +61,18 @@
|
||||
name = "Anita"
|
||||
icon_state = "hair_anita"
|
||||
|
||||
/datum/sprite_accessory/hair/astolfo
|
||||
name = "Astolfo"
|
||||
icon_state = "hair_astolfo"
|
||||
|
||||
/datum/sprite_accessory/hair/balding
|
||||
name = "Balding Hair"
|
||||
icon_state = "hair_e"
|
||||
|
||||
/datum/sprite_accessory/hair/baum
|
||||
name = "Baum"
|
||||
icon_state = "hair_baum"
|
||||
|
||||
/datum/sprite_accessory/hair/bedhead
|
||||
name = "Bedhead"
|
||||
icon_state = "hair_bedhead"
|
||||
@@ -85,6 +113,14 @@
|
||||
name = "Belle"
|
||||
icon_state = "hair_belle"
|
||||
|
||||
/datum/sprite_accessory/hair/bluntbangs
|
||||
name = "Bluntbangs"
|
||||
icon_state = "hair_bluntbangs"
|
||||
|
||||
/datum/sprite_accessory/hair/bluntbangsalt
|
||||
name = "Bluntbangs (Alt)"
|
||||
icon_state = "hair_bluntbangsalt"
|
||||
|
||||
/datum/sprite_accessory/hair/bob
|
||||
name = "Bob Hair"
|
||||
icon_state = "hair_bob"
|
||||
@@ -109,6 +145,10 @@
|
||||
name = "Bobcut (Alt)"
|
||||
icon_state = "hair_bobcutalt"
|
||||
|
||||
/datum/sprite_accessory/hair/bobcutalt2
|
||||
name = "Bobcut (Alt) 2"
|
||||
icon_state = "hair_bobcutalt2"
|
||||
|
||||
/datum/sprite_accessory/hair/boddicker
|
||||
name = "Boddicker"
|
||||
icon_state = "hair_boddicker"
|
||||
@@ -205,6 +245,14 @@
|
||||
name = "CIA"
|
||||
icon_state = "hair_cia"
|
||||
|
||||
/datum/sprite_accessory/hair/combedback
|
||||
name = "Combed Back"
|
||||
icon_state = "hair_combedback"
|
||||
|
||||
/datum/sprite_accessory/hair/combedbob
|
||||
name = "Combed Bob"
|
||||
icon_state = "hair_combedbob"
|
||||
|
||||
/datum/sprite_accessory/hair/combover
|
||||
name = "Combover"
|
||||
icon_state = "hair_combover"
|
||||
@@ -233,6 +281,14 @@
|
||||
name = "Cornrow Tail"
|
||||
icon_state = "hair_cornrowtail"
|
||||
|
||||
/datum/sprite_accessory/hair/cotton
|
||||
name = "Cotton"
|
||||
icon_state = "hair_cotton"
|
||||
|
||||
/datum/sprite_accessory/hair/cottonalt
|
||||
name = "Cotton (Alt)"
|
||||
icon_state = "hair_cottonalt"
|
||||
|
||||
/datum/sprite_accessory/hair/country
|
||||
name = "Country"
|
||||
icon_state = "hair_country"
|
||||
@@ -261,6 +317,10 @@
|
||||
name = "Devil Lock"
|
||||
icon_state = "hair_devillock"
|
||||
|
||||
/datum/sprite_accessory/hair/diagonalbangs
|
||||
name = "Diagonal Bangs"
|
||||
icon_state = "hair_diagonalbangs"
|
||||
|
||||
/datum/sprite_accessory/hair/dreadlocks
|
||||
name = "Dreadlocks"
|
||||
icon_state = "hair_dreads"
|
||||
@@ -337,10 +397,22 @@
|
||||
name = "Fluffy"
|
||||
icon_state = "hair_fluffy"
|
||||
|
||||
/datum/sprite_accessory/hair/fortuneteller
|
||||
name = "Fortune Teller"
|
||||
icon_state = "hair_fortuneteller"
|
||||
|
||||
/datum/sprite_accessory/hair/fringetail
|
||||
name = "Fringe Tail"
|
||||
icon_state = "hair_fringetail"
|
||||
|
||||
/datum/sprite_accessory/hair/froofy
|
||||
name = "Froofy"
|
||||
icon_state = "hair_froofy"
|
||||
|
||||
/datum/sprite_accessory/hair/geisha
|
||||
name = "Geisha"
|
||||
icon_state = "hair_geisha"
|
||||
|
||||
/datum/sprite_accessory/hair/gelled
|
||||
name = "Gelled Back"
|
||||
icon_state = "hair_gelled"
|
||||
@@ -349,6 +421,26 @@
|
||||
name = "Gentle"
|
||||
icon_state = "hair_gentle"
|
||||
|
||||
/datum/sprite_accessory/hair/glammetal
|
||||
name = "Glam Metal"
|
||||
icon_state = "hair_glammetal"
|
||||
|
||||
/datum/sprite_accessory/hair/gloomy
|
||||
name = "Gloomy"
|
||||
icon_state = "hair_gloomy"
|
||||
|
||||
/datum/sprite_accessory/hair/gloomylong
|
||||
name = "Gloomy (Long)"
|
||||
icon_state = "hair_gloomylong"
|
||||
|
||||
/datum/sprite_accessory/hair/hajime
|
||||
name = "Hajime"
|
||||
icon_state = "hair_hajime"
|
||||
|
||||
/datum/sprite_accessory/hair/hajimealt
|
||||
name = "Hajime (Alt)"
|
||||
icon_state = "hair_hajimealt"
|
||||
|
||||
/datum/sprite_accessory/hair/halfbang
|
||||
name = "Half-banged Hair"
|
||||
icon_state = "hair_halfbang"
|
||||
@@ -365,6 +457,10 @@
|
||||
name = "Half-shaved Hair"
|
||||
icon_state = "hair_halfshaved"
|
||||
|
||||
/datum/sprite_accessory/hair/harold
|
||||
name = "Harold"
|
||||
icon_state = "hair_harold"
|
||||
|
||||
/datum/sprite_accessory/hair/hedgehog
|
||||
name = "Hedgehog Hair"
|
||||
icon_state = "hair_hedgehog"
|
||||
@@ -393,6 +489,10 @@
|
||||
name = "Hitop"
|
||||
icon_state = "hair_hitop"
|
||||
|
||||
/datum/sprite_accessory/hair/inari
|
||||
name = "Inari"
|
||||
icon_state = "hair_inari"
|
||||
|
||||
/datum/sprite_accessory/hair/inkling
|
||||
name = "Inkling"
|
||||
icon_state = "hair_inkling"
|
||||
@@ -421,14 +521,18 @@
|
||||
name = "Keanu"
|
||||
icon_state = "hair_keanu"
|
||||
|
||||
/datum/sprite_accessory/hair/kusangi
|
||||
name = "Kusanagi"
|
||||
icon_state = "hair_kusanagi"
|
||||
/datum/sprite_accessory/hair/kisaragi
|
||||
name = "Kisaragi"
|
||||
icon_state = "hair_kisaragi"
|
||||
|
||||
/datum/sprite_accessory/hair/kleeia
|
||||
name = "Kleeia"
|
||||
icon_state = "hair_kleeia"
|
||||
|
||||
/datum/sprite_accessory/hair/kusangi
|
||||
name = "Kusanagi"
|
||||
icon_state = "hair_kusanagi"
|
||||
|
||||
/datum/sprite_accessory/hair/long
|
||||
name = "Long Hair 1"
|
||||
icon_state = "hair_long"
|
||||
@@ -449,6 +553,10 @@
|
||||
name = "Long Over Eye"
|
||||
icon_state = "hair_longovereye"
|
||||
|
||||
/datum/sprite_accessory/hair/long_over_eyealt
|
||||
name = "Long Over Eye (Alt)"
|
||||
icon_state = "hair_longovereyealt"
|
||||
|
||||
/datum/sprite_accessory/hair/longbangs
|
||||
name = "Long Bangs"
|
||||
icon_state = "hair_lbangs"
|
||||
@@ -489,10 +597,6 @@
|
||||
name = "Mohawk"
|
||||
icon_state = "hair_d"
|
||||
|
||||
/datum/sprite_accessory/hair/newyou
|
||||
name = "New You"
|
||||
icon_state = "hair_newyou"
|
||||
|
||||
/datum/sprite_accessory/hair/reversemohawk
|
||||
name = "Mohawk (Reverse)"
|
||||
icon_state = "hair_reversemohawk"
|
||||
@@ -509,6 +613,10 @@
|
||||
name = "Mulder"
|
||||
icon_state = "hair_mulder"
|
||||
|
||||
/datum/sprite_accessory/hair/newyou
|
||||
name = "New You"
|
||||
icon_state = "hair_newyou"
|
||||
|
||||
/datum/sprite_accessory/hair/nia
|
||||
name = "Nia"
|
||||
icon_state = "hair_nia"
|
||||
@@ -579,10 +687,18 @@
|
||||
name = "Pompadour (Big)"
|
||||
icon_state = "hair_bigpompadour"
|
||||
|
||||
/datum/sprite_accessory/hair/bigpompadouralt
|
||||
name = "Pompadour (Big) (Alt)"
|
||||
icon_state = "hair_bigpompadouralt"
|
||||
|
||||
/datum/sprite_accessory/hair/ponytail1
|
||||
name = "Ponytail"
|
||||
icon_state = "hair_ponytail"
|
||||
|
||||
/datum/sprite_accessory/hair/ponytail1alt
|
||||
name = "Ponytail (Alt)"
|
||||
icon_state = "hair_ponytailalt"
|
||||
|
||||
/datum/sprite_accessory/hair/ponytail2
|
||||
name = "Ponytail 2"
|
||||
icon_state = "hair_ponytail2"
|
||||
@@ -591,14 +707,26 @@
|
||||
name = "Ponytail 3"
|
||||
icon_state = "hair_ponytail3"
|
||||
|
||||
/datum/sprite_accessory/hair/ponytail3alt
|
||||
name = "Ponytail 3 (Alt)"
|
||||
icon_state = "hair_ponytail3alt"
|
||||
|
||||
/datum/sprite_accessory/hair/ponytail4
|
||||
name = "Ponytail 4"
|
||||
icon_state = "hair_ponytail4"
|
||||
|
||||
/datum/sprite_accessory/hair/ponytail4alt
|
||||
name = "Ponytail 4 (Alt)"
|
||||
icon_state = "hair_ponytail4alt"
|
||||
|
||||
/datum/sprite_accessory/hair/ponytail5
|
||||
name = "Ponytail 5"
|
||||
icon_state = "hair_ponytail5"
|
||||
|
||||
/datum/sprite_accessory/hair/ponytail6
|
||||
name = "Ponytail 6"
|
||||
icon_state = "hair_ponytail6"
|
||||
|
||||
/datum/sprite_accessory/hair/highponytail
|
||||
name = "Ponytail (High)"
|
||||
icon_state = "hair_highponytail"
|
||||
@@ -623,6 +751,10 @@
|
||||
name = "Ponytail (Side) 4"
|
||||
icon_state = "hair_sidetail4"
|
||||
|
||||
/datum/sprite_accessory/hair/sidetail5
|
||||
name = "Ponytail (Side) 5"
|
||||
icon_state = "hair_sidetail5"
|
||||
|
||||
/datum/sprite_accessory/hair/sharptail
|
||||
name = "Ponytail (Sharp)"
|
||||
icon_state = "hair_sharptail"
|
||||
@@ -639,10 +771,18 @@
|
||||
name = "Poofy 2"
|
||||
icon_state = "hair_poofy2"
|
||||
|
||||
/datum/sprite_accessory/hair/quadcurls
|
||||
name = "Quad Curls"
|
||||
icon_state = "hair_quadcurls"
|
||||
|
||||
/datum/sprite_accessory/hair/quiff
|
||||
name = "Quiff"
|
||||
icon_state = "hair_quiff"
|
||||
|
||||
/datum/sprite_accessory/hair/rockstar
|
||||
name = "Rockstar"
|
||||
icon_state = "hair_rockstar"
|
||||
|
||||
/datum/sprite_accessory/hair/ronin
|
||||
name = "Ronin"
|
||||
icon_state = "hair_ronin"
|
||||
@@ -759,6 +899,10 @@
|
||||
name = "Slightly Long Hair"
|
||||
icon_state = "hair_protagonist"
|
||||
|
||||
/datum/sprite_accessory/hair/slightlymessy
|
||||
name = "Slightly Messy Hair"
|
||||
icon_state = "hair_slightlymessy"
|
||||
|
||||
/datum/sprite_accessory/hair/spiky
|
||||
name = "Spiky"
|
||||
icon_state = "hair_spikey"
|
||||
@@ -771,6 +915,26 @@
|
||||
name = "Spiky 3"
|
||||
icon_state = "hair_spiky2"
|
||||
|
||||
/datum/sprite_accessory/hair/slimedroplet
|
||||
name = "Slime Droplet"
|
||||
icon_state = "hair_slimedroplet"
|
||||
|
||||
/datum/sprite_accessory/hair/slimedropletalt
|
||||
name = "Slime Droplet (Alt)"
|
||||
icon_state = "hair_slimedropletalt"
|
||||
|
||||
/datum/sprite_accessory/hair/slimespikes
|
||||
name = "Slime Spikes"
|
||||
icon_state = "hair_slimespikes"
|
||||
|
||||
/datum/sprite_accessory/hair/slimetendrils
|
||||
name = "Slime Tendrils"
|
||||
icon_state = "hair_slimetendrils"
|
||||
|
||||
/datum/sprite_accessory/hair/slimetendrilsalt
|
||||
name = "Slime Tendrils (Alt)"
|
||||
icon_state = "hair_slimetendrilsalt"
|
||||
|
||||
/datum/sprite_accessory/hair/supernova
|
||||
name = "Supernova"
|
||||
icon_state = "hair_supernova"
|
||||
@@ -851,6 +1015,10 @@
|
||||
name = "Very Long Hair 2"
|
||||
icon_state = "hair_longest"
|
||||
|
||||
/datum/sprite_accessory/hair/longestalt
|
||||
name = "Very Long Hair 2 (Alt)"
|
||||
icon_state = "hair_longestalt"
|
||||
|
||||
/datum/sprite_accessory/hair/longest2
|
||||
name = "Very Long Over Eye"
|
||||
icon_state = "hair_longest2"
|
||||
@@ -886,3 +1054,7 @@
|
||||
/datum/sprite_accessory/hair/ziegler
|
||||
name = "Ziegler"
|
||||
icon_state = "hair_ziegler"
|
||||
|
||||
/datum/sprite_accessory/hair/zone
|
||||
name = "Zone"
|
||||
icon_state = "hair_zone"
|
||||
|
||||
@@ -32,20 +32,20 @@
|
||||
icon = 'modular_citadel/icons/mob/synthliz_body_markings.dmi'
|
||||
name = "Synthetic Lizard - Pecs"
|
||||
icon_state = "synthlizpecs"
|
||||
matrixed_sections = MATRIX_GREEN
|
||||
covered_limbs = list("Chest" = MATRIX_GREEN)
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/synthliz/synthliz_pecslight
|
||||
icon = 'modular_citadel/icons/mob/synthliz_body_markings.dmi'
|
||||
name = "Synthetic Lizard - Pecs Light"
|
||||
icon_state = "synthlizpecslight"
|
||||
matrixed_sections = MATRIX_GREEN_BLUE
|
||||
covered_limbs = list("Chest" = MATRIX_GREEN_BLUE)
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/synthliz
|
||||
recommended_species = list("synthliz")
|
||||
icon = 'modular_citadel/icons/mob/synthliz_body_markings.dmi'
|
||||
name = "Synthetic Lizard - Plates"
|
||||
icon_state = "synthlizscutes"
|
||||
matrixed_sections = MATRIX_GREEN
|
||||
covered_limbs = list("Chest" = MATRIX_GREEN)
|
||||
|
||||
//Synth tails
|
||||
/datum/sprite_accessory/tails/mam_tails/synthliz
|
||||
|
||||
@@ -13,6 +13,10 @@
|
||||
|
||||
/obj/effect/dummy/phased_mob/slaughter/ex_act()
|
||||
return
|
||||
|
||||
/obj/effect/dummy/phased_mob/slaughter/wave_ex_act(power, datum/wave_explosion/explosion, dir)
|
||||
return power
|
||||
|
||||
/obj/effect/dummy/phased_mob/slaughter/bullet_act()
|
||||
return BULLET_ACT_FORCE_PIERCE
|
||||
|
||||
|
||||
@@ -46,6 +46,9 @@
|
||||
/mob/living/brain/ex_act() //you cant blow up brainmobs because it makes transfer_to() freak out when borgs blow up.
|
||||
return
|
||||
|
||||
/mob/living/brain/wave_ex_act(power, datum/wave_explosion/explosion, dir)
|
||||
return power
|
||||
|
||||
/mob/living/brain/blob_act(obj/structure/blob/B)
|
||||
return
|
||||
|
||||
|
||||
@@ -370,7 +370,7 @@
|
||||
breakouttime = 50
|
||||
visible_message("<span class='warning'>[src] is trying to break [I]!</span>")
|
||||
to_chat(src, "<span class='notice'>You attempt to break [I]... (This will take around 5 seconds and you need to stand still.)</span>")
|
||||
if(do_after(src, breakouttime, 0, target = src))
|
||||
if(do_after(src, breakouttime, 0, target = src, required_mobility_flags = MOBILITY_RESIST))
|
||||
clear_cuffs(I, cuff_break)
|
||||
else
|
||||
to_chat(src, "<span class='warning'>You fail to break [I]!</span>")
|
||||
|
||||
@@ -41,10 +41,10 @@
|
||||
|
||||
. += "[t_He] [t_is] wearing [w_uniform.get_examine_string(user)][accessory_msg]."
|
||||
//head
|
||||
if(head && !(head.item_flags & EXAMINE_SKIP))
|
||||
if(head && !(head.obj_flags & EXAMINE_SKIP))
|
||||
. += "[t_He] [t_is] wearing [head.get_examine_string(user)] on [t_his] head."
|
||||
//suit/armor
|
||||
if(wear_suit && !(wear_suit.item_flags & EXAMINE_SKIP))
|
||||
if(wear_suit && !(wear_suit.obj_flags & EXAMINE_SKIP))
|
||||
. += "[t_He] [t_is] wearing [wear_suit.get_examine_string(user)]."
|
||||
//suit/armor storage
|
||||
if(s_store && !(SLOT_S_STORE in obscured))
|
||||
|
||||
@@ -1055,6 +1055,17 @@
|
||||
. = ..()
|
||||
set_species(race)
|
||||
|
||||
/mob/living/carbon/human/get_tooltip_data()
|
||||
var/t_He = p_they(TRUE)
|
||||
var/t_is = p_are()
|
||||
. = list()
|
||||
var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE))
|
||||
if(skipface || get_visible_name() == "Unknown")
|
||||
. += "You can't make out what species they are."
|
||||
else
|
||||
. += "[t_He] [t_is] a [dna.custom_species ? dna.custom_species : dna.species.name]"
|
||||
SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, usr, .)
|
||||
|
||||
/mob/living/carbon/human/species/abductor
|
||||
race = /datum/species/abductor
|
||||
|
||||
|
||||
@@ -77,6 +77,8 @@
|
||||
var/last_fire_update
|
||||
var/hardcore_survival_score = 0
|
||||
|
||||
tooltips = TRUE
|
||||
|
||||
/// Unarmed parry data for human
|
||||
/datum/block_parry_data/unarmed/human
|
||||
parry_respect_clickdelay = TRUE
|
||||
|
||||
@@ -149,6 +149,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
|
||||
///
|
||||
var/sound/attack_sound = 'sound/weapons/punch1.ogg'
|
||||
var/sound/miss_sound = 'sound/weapons/punchmiss.ogg'
|
||||
var/attack_sound_override = null
|
||||
|
||||
var/list/mob/living/ignored_by = list() // list of mobs that will ignore this species
|
||||
//Breathing!
|
||||
@@ -569,12 +570,10 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
|
||||
/datum/species/proc/remove_blacklisted_quirks(mob/living/carbon/C)
|
||||
var/mob/living/L = C.mind?.current
|
||||
if(istype(L))
|
||||
var/list/my_quirks = L.client?.prefs.all_quirks.Copy()
|
||||
SSquirks.filter_quirks(my_quirks, blacklisted_quirks)
|
||||
for(var/q in L.roundstart_quirks)
|
||||
var/datum/quirk/Q = q
|
||||
if(!(SSquirks.quirk_name_by_path(Q.type) in my_quirks))
|
||||
L.remove_quirk(Q.type)
|
||||
if(Q.type in blacklisted_quirks)
|
||||
qdel(Q)
|
||||
removed_quirks += Q.type
|
||||
|
||||
// restore any quirks that we removed
|
||||
@@ -1615,7 +1614,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
|
||||
|
||||
|
||||
var/armor_block = target.run_armor_check(affecting, "melee")
|
||||
playsound(target.loc, user.dna.species.attack_sound, 25, 1, -1)
|
||||
playsound(target.loc, user.dna.species.attack_sound_override || attack_sound, 25, 1, -1)
|
||||
target.visible_message("<span class='danger'>[user] [atk_verb]ed [target]!</span>", \
|
||||
"<span class='userdanger'>[user] [atk_verb]ed you!</span>", null, COMBAT_MESSAGE_RANGE, null, \
|
||||
user, "<span class='danger'>You [atk_verb]ed [target]!</span>")
|
||||
|
||||
+3
-3
@@ -1,11 +1,11 @@
|
||||
/datum/species/mammal
|
||||
name = "Anthromorph"
|
||||
name = "Anthropomorph"
|
||||
id = SPECIES_MAMMAL
|
||||
default_color = "4B4B4B"
|
||||
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR,HORNCOLOR,WINGCOLOR,HAS_FLESH,HAS_BONE)
|
||||
inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_BEAST
|
||||
mutant_bodyparts = list("mcolor" = "FFFFFF","mcolor2" = "FFFFFF","mcolor3" = "FFFFFF", "mam_snouts" = "Husky", "mam_tail" = "Husky", "mam_ears" = "Husky", "deco_wings" = "None",
|
||||
"mam_body_markings" = "Husky", "taur" = "None", "horns" = "None", "legs" = "Plantigrade", "meat_type" = "Mammalian")
|
||||
"mam_body_markings" = list(), "taur" = "None", "horns" = "None", "legs" = "Plantigrade", "meat_type" = "Mammalian")
|
||||
attack_verb = "claw"
|
||||
attack_sound = 'sound/weapons/slash.ogg'
|
||||
miss_sound = 'sound/weapons/slashmiss.ogg'
|
||||
@@ -20,7 +20,7 @@
|
||||
allowed_limb_ids = list("mammal","aquatic","avian")
|
||||
|
||||
/datum/species/mammal/synthetic
|
||||
name = "Synthetic Anthromorph"
|
||||
name = "Synthetic Anthropomorph"
|
||||
id = SPECIES_MAMMAL_SYNTHETIC
|
||||
|
||||
species_traits = list(MUTCOLORS,NOTRANSSTING,EYECOLOR,LIPS,HAIR,ROBOTIC_LIMBS,HAS_FLESH,HAS_BONE,WINGCOLOR,HORNCOLOR)
|
||||
@@ -1,5 +1,5 @@
|
||||
/datum/species/insect
|
||||
name = "Anthromorphic Insect"
|
||||
name = "Anthropomorphic Insect"
|
||||
id = SPECIES_INSECT
|
||||
say_mod = "chitters"
|
||||
default_color = "00FF00"
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/datum/species/fly
|
||||
name = "Anthromorphic Fly"
|
||||
name = "Anthropomorphic Fly"
|
||||
id = SPECIES_FLY
|
||||
say_mod = "buzzes"
|
||||
species_traits = list(NOEYES,HAS_FLESH,HAS_BONE)
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
default_color = "FFFFFF"
|
||||
|
||||
species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,MUTCOLORS_PARTSONLY,WINGCOLOR,HAS_FLESH,HAS_BONE)
|
||||
mutant_bodyparts = list("mcolor" = "FFFFFF", "mcolor2" = "FFFFFF","mcolor3" = "FFFFFF","tail_human" = "None", "ears" = "None", "taur" = "None", "deco_wings" = "None")
|
||||
mutant_bodyparts = list("mcolor" = "FFFFFF", "mcolor2" = "FFFFFF","mcolor3" = "FFFFFF","tail_human" = "None", "ears" = "None", "taur" = "None", "deco_wings" = "None", "legs" = "Plantigrade")
|
||||
use_skintones = USE_SKINTONES_GRAYSCALE_CUSTOM
|
||||
skinned_type = /obj/item/stack/sheet/animalhide/human
|
||||
disliked_food = GROSS | RAW
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/datum/species/lizard
|
||||
// Reptilian humanoids with scaled skin and tails.
|
||||
name = "Anthromorphic Lizard"
|
||||
name = "Anthropomorphic Lizard"
|
||||
id = SPECIES_LIZARD
|
||||
say_mod = "hisses"
|
||||
default_color = "00FF00"
|
||||
@@ -11,7 +11,7 @@
|
||||
coldmod = 1.5
|
||||
heatmod = 0.67
|
||||
mutant_bodyparts = list("mcolor" = "0F0", "mcolor2" = "0F0", "mcolor3" = "0F0", "tail_lizard" = "Smooth", "mam_snouts" = "Round",
|
||||
"horns" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None",
|
||||
"horns" = "None", "frills" = "None", "spines" = "None", "mam_body_markings" = list(),
|
||||
"legs" = "Digitigrade", "taur" = "None", "deco_wings" = "None")
|
||||
attack_verb = "slash"
|
||||
attack_sound = 'sound/weapons/slash.ogg'
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/datum/species/mush //mush mush codecuck
|
||||
name = "Anthromorphic Mushroom"
|
||||
name = "Anthropomorphic Mushroom"
|
||||
id = SPECIES_MUSHROOM
|
||||
mutant_bodyparts = list("caps" = "Round")
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/datum/species/pod
|
||||
// A mutation caused by a human being ressurected in a revival pod. These regain health in light, and begin to wither in darkness.
|
||||
name = "Anthromorphic Plant"
|
||||
name = "Anthropomorphic Plant"
|
||||
id = SPECIES_POD
|
||||
default_color = "59CE00"
|
||||
species_traits = list(MUTCOLORS,EYECOLOR,CAN_SCAR,HAS_FLESH,HAS_BONE)
|
||||
@@ -71,10 +71,10 @@
|
||||
H.emote("spin")
|
||||
|
||||
/datum/species/pod/pseudo_weak
|
||||
name = "Anthromorphic Plant"
|
||||
name = "Anthropomorphic Plant"
|
||||
id = SPECIES_POD_WEAK
|
||||
species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,MUTCOLORS,CAN_SCAR,HAS_FLESH,HAS_BONE)
|
||||
mutant_bodyparts = list("mcolor" = "FFFFFF","mcolor2" = "FFFFFF","mcolor3" = "FFFFFF", "mam_snouts" = "Husky", "mam_tail" = "Husky", "mam_ears" = "Husky", "mam_body_markings" = "Husky", "taur" = "None", "legs" = "Normal Legs")
|
||||
mutant_bodyparts = list("mcolor" = "FFFFFF","mcolor2" = "FFFFFF","mcolor3" = "FFFFFF", "mam_snouts" = "Husky", "mam_tail" = "Husky", "mam_ears" = "Husky", "mam_body_markings" = list(), "taur" = "None", "legs" = "Normal Legs")
|
||||
limbs_id = SPECIES_POD
|
||||
light_nutrition_gain_factor = 3
|
||||
light_bruteheal = -0.2
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
say_mod = "hisses"
|
||||
default_color = "00FF00"
|
||||
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,CAN_SCAR,HAS_FLESH,HAS_BONE)
|
||||
mutant_bodyparts = list("xenotail"="Xenomorph Tail","xenohead"="Standard","xenodorsal"="Standard", "mam_body_markings" = "Xeno","mcolor" = "0F0","mcolor2" = "0F0","mcolor3" = "0F0","taur" = "None", "legs" = "Digitigrade","deco_wings"= "None")
|
||||
mutant_bodyparts = list("xenotail"="Xenomorph Tail","xenohead"="Standard","xenodorsal"="Standard", "mam_body_markings" = list(),"mcolor" = "0F0","mcolor2" = "0F0","mcolor3" = "0F0","taur" = "None", "legs" = "Digitigrade","deco_wings"= "None")
|
||||
attack_verb = "slash"
|
||||
attack_sound = 'sound/weapons/slash.ogg'
|
||||
miss_sound = 'sound/weapons/slashmiss.ogg'
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user