This commit is contained in:
zerothebigboy
2021-05-23 15:29:20 -04:00
189 changed files with 5866 additions and 1941 deletions
+2
View File
@@ -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)
+86
View File
@@ -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
+1
View File
@@ -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
+1 -1
View File
@@ -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:
-1
View File
@@ -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
View File
@@ -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",
+1 -2
View File
@@ -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
+6 -3
View File
@@ -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)))
+1
View File
@@ -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"
-1
View File
@@ -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)
. = ..()
+5
View File
@@ -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"
+15
View File
@@ -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
+23
View File
@@ -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
+2 -1
View File
@@ -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))
+8 -1
View File
@@ -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()
+378
View File
@@ -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
+2 -1
View File
@@ -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
View File
@@ -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
+3
View File
@@ -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)
. = ..()
+4
View File
@@ -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)
+2
View File
@@ -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
+10
View File
@@ -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.
+2
View File
@@ -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
+2
View File
@@ -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"
+38
View File
@@ -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()
+8
View File
@@ -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?
. = ..()
+3
View File
@@ -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."
+6 -1
View File
@@ -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 = ..()
+54
View File
@@ -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), \
+4 -1
View File
@@ -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//
+13
View File
@@ -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"
+15
View File
@@ -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
+3
View File
@@ -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
+55
View File
@@ -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)
+17
View File
@@ -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))
+2
View File
@@ -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
+18
View File
@@ -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)
+46
View File
@@ -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"
-1
View File
@@ -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()
+20
View File
@@ -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)
+51 -13
View File
@@ -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))
+1 -1
View File
@@ -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,
+2
View File
@@ -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)
..()
+178 -36
View File
@@ -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]];'>&nbsp;&nbsp;&nbsp;</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]];'>&nbsp;&nbsp;&nbsp;</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]];'>&nbsp;&nbsp;&nbsp;</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];'>&#708;</a> <a href='?_src_=prefs;preference=marking_up;task=input;marking_index=[marking_index];marking_type=[marking_type]'>&#709;</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
+50 -7
View File
@@ -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"])
+41 -1
View File
@@ -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."
+1 -3
View File
@@ -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
+4 -7
View File
@@ -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"
+15 -8
View File
@@ -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)
+1 -1
View File
@@ -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()
+1
View File
@@ -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"
+1
View File
@@ -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),
+12
View File
@@ -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
+4
View File
@@ -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
+3
View File
@@ -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
+1 -1
View File
@@ -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>")
@@ -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