Merge branch 'master' of https://github.com/Citadel-Station-13/Citadel-Station-13 into upstream-merge-27697
This commit is contained in:
@@ -377,6 +377,10 @@
|
||||
icon_state = "sleeper"
|
||||
flavour_text = "You are a beach bum!"
|
||||
|
||||
/obj/effect/mob_spawn/human/beach/equip(mob/living/carbon/human/H)
|
||||
..()
|
||||
H.dna.add_mutation(STONER)
|
||||
|
||||
/////////////////Officers+Nanotrasen Security//////////////////////
|
||||
|
||||
/obj/effect/mob_spawn/human/bridgeofficer
|
||||
|
||||
@@ -1582,7 +1582,7 @@
|
||||
name = "Contraband Crate"
|
||||
contraband = TRUE
|
||||
cost = 3000
|
||||
num_contained = 6
|
||||
num_contained = 5
|
||||
contains = list(/obj/item/weapon/poster/random_contraband,
|
||||
/obj/item/weapon/storage/fancy/cigarettes/cigpack_shadyjims,
|
||||
/obj/item/weapon/storage/fancy/cigarettes/cigpack_midori,
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
/obj/item/clothing/head/hunter
|
||||
name = "hunter hat"
|
||||
desc = "It's a flimsy looking hat."
|
||||
icon_state = "hunter"
|
||||
icon = 'icons/obj/clothing/cit_hats.dmi'
|
||||
@@ -280,3 +280,9 @@
|
||||
name = "magnificent crown"
|
||||
desc = "A crown worn by only the highest emperors of the land."
|
||||
icon_state = "fancycrown"
|
||||
|
||||
/obj/item/clothing/head/hunter
|
||||
name = "hunter hat"
|
||||
desc = "It's a flimsy looking hat."
|
||||
item_state = "hunter_hat"
|
||||
icon_state = "hunter_hat"
|
||||
|
||||
@@ -541,5 +541,5 @@
|
||||
name = "spooky ghost"
|
||||
desc = "this is obviously just a bedsheet, but maybe try it on?"
|
||||
icon_state = "bedsheet"
|
||||
user_vars_to_edit = list("name" = "Spooky Ghost", "real_name" = "Spooky Ghost" , "incorporeal_move" = 1, "appearance_flags" = KEEP_TOGETHER|TILE_BOUND, "alpha" = 150)
|
||||
user_vars_to_edit = list("name" = "Spooky Ghost", "real_name" = "Spooky Ghost" , "incorporeal_move" = INCORPOREAL_MOVE_BASIC, "appearance_flags" = KEEP_TOGETHER|TILE_BOUND, "alpha" = 150)
|
||||
alternate_worn_layer = ABOVE_BODY_FRONT_LAYER //so the bedsheet goes over everything but fire
|
||||
|
||||
+18
-17
@@ -136,26 +136,27 @@ GLOBAL_VAR_CONST(access_away_generic4, 208)
|
||||
/obj/item/proc/GetID()
|
||||
return null
|
||||
|
||||
/obj/proc/text2access(access_text)
|
||||
. = list()
|
||||
if(!access_text)
|
||||
return
|
||||
var/list/split = splittext(access_text,";")
|
||||
for(var/x in split)
|
||||
var/n = text2num(x)
|
||||
if(n)
|
||||
. += n
|
||||
|
||||
//Call this before using req_access or req_one_access directly
|
||||
/obj/proc/gen_access()
|
||||
//These generations have been moved out of /obj/New() because they were slowing down the creation of objects that never even used the access system.
|
||||
if(!src.req_access)
|
||||
src.req_access = list()
|
||||
if(src.req_access_txt)
|
||||
var/list/req_access_str = splittext(req_access_txt,";")
|
||||
for(var/x in req_access_str)
|
||||
var/n = text2num(x)
|
||||
if(n)
|
||||
req_access += n
|
||||
|
||||
if(!src.req_one_access)
|
||||
src.req_one_access = list()
|
||||
if(src.req_one_access_txt)
|
||||
var/list/req_one_access_str = splittext(req_one_access_txt,";")
|
||||
for(var/x in req_one_access_str)
|
||||
var/n = text2num(x)
|
||||
if(n)
|
||||
req_one_access += n
|
||||
if(!req_access)
|
||||
req_access = list()
|
||||
for(var/a in text2access(req_access_txt))
|
||||
req_access += a
|
||||
if(!req_one_access)
|
||||
req_one_access = list()
|
||||
for(var/b in text2access(req_one_access_txt))
|
||||
req_one_access += b
|
||||
|
||||
/obj/proc/check_access(obj/item/I)
|
||||
gen_access()
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
/datum/language/beachbum
|
||||
name = "Beach Bumbian"
|
||||
desc = "For when you're too toasted to speak normally."
|
||||
speech_verb = "mumbles"
|
||||
ask_verb = "grills"
|
||||
exclaim_verb = "hollers"
|
||||
key = "u"
|
||||
space_chance = 85
|
||||
default_priority = 90
|
||||
syllables = list("cowabunga", "rad", "radical", "dudes", "bogus", "weeed", "every",
|
||||
"dee", "dah", "woah", "surf", "blazed", "high", "heinous", "day",
|
||||
"brah", "bro", "blown", "catch", "body", "beach", "oooo", "twenty",
|
||||
"shiz", "phiz", "wizz", "pop", "chill", "awesome", "dude", "it",
|
||||
"wax", "stoked", "yes", "ding", "way", "no", "wicked", "aaaa",
|
||||
"cool", "hoo", "wah", "wee", "man", "maaaaaan", "mate", "wick",
|
||||
"oh", "ocean", "up", "out", "rip", "slide", "big", "stomp",
|
||||
"weed", "pot", "smoke", "four-twenty", "shove", "wacky", "hah",
|
||||
"sick", "slash", "spit", "stoked", "shallow", "gun", "party",
|
||||
"heavy", "stellar", "excellent", "triumphant", "babe", "four",
|
||||
"tail", "trim", "tube", "wobble", "roll", "gnarly", "epic")
|
||||
|
||||
icon_state = "beach"
|
||||
@@ -20,3 +20,16 @@
|
||||
. = ..()
|
||||
if(.)
|
||||
update_hair()
|
||||
|
||||
/mob/living/carbon/human/set_drugginess(amount)
|
||||
..()
|
||||
if(!amount)
|
||||
remove_language(/datum/language/beachbum)
|
||||
|
||||
/mob/living/carbon/human/adjust_drugginess(amount)
|
||||
..()
|
||||
if(!dna.check_mutation(STONER))
|
||||
if(druggy)
|
||||
grant_language(/datum/language/beachbum)
|
||||
else
|
||||
remove_language(/datum/language/beachbum)
|
||||
|
||||
@@ -24,7 +24,8 @@
|
||||
var/last_special = 0 //Used by the resist verb, likely used to prevent players from bypassing next_move by logging in/out.
|
||||
|
||||
//Allows mobs to move through dense areas without restriction. For instance, in space or out of holder objects.
|
||||
var/incorporeal_move = 0 //0 is off, 1 is normal, 2 is for ninjas.
|
||||
var/incorporeal_move = FALSE //FALSE is off, INCORPOREAL_MOVE_BASIC is normal, INCORPOREAL_MOVE_SHADOW is for ninjas
|
||||
//and INCORPOREAL_MOVE_JAUNT is blocked by holy water/salt
|
||||
|
||||
var/list/surgeries = list() //a list of surgery datums. generally empty, they're added when the player wants them.
|
||||
|
||||
|
||||
@@ -833,8 +833,20 @@
|
||||
|
||||
/mob/living/silicon/ai/proc/relay_speech(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode)
|
||||
raw_message = lang_treat(speaker, message_language, raw_message, spans, message_mode)
|
||||
var/name_used = speaker.GetVoice()
|
||||
var/rendered = "<i><span class='game say'>Relayed Speech: <span class='name'>[name_used]</span> <span class='message'>[raw_message]</span></span></i>"
|
||||
var/start = "Relayed Speech: "
|
||||
var/namepart = "[speaker.GetVoice()][speaker.get_alt_name()]"
|
||||
var/hrefpart = "<a href='?src=\ref[src];track=[html_encode(namepart)]'>"
|
||||
var/jobpart
|
||||
|
||||
if (iscarbon(speaker))
|
||||
var/mob/living/carbon/S = speaker
|
||||
if(S.job)
|
||||
jobpart = "[S.job]"
|
||||
else
|
||||
jobpart = "Unknown"
|
||||
|
||||
var/rendered = "<i><span class='game say'>[start]<span class='name'>[hrefpart][namepart] ([jobpart])</a> </span><span class='message'>[raw_message]</span></span></i>"
|
||||
|
||||
show_message(rendered, 2)
|
||||
|
||||
/mob/living/silicon/ai/fully_replace_character_name(oldname,newname)
|
||||
|
||||
@@ -44,6 +44,13 @@
|
||||
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat/slab/pug = 3)
|
||||
gold_core_spawnable = 2
|
||||
|
||||
/mob/living/simple_animal/pet/dog/Initialize()
|
||||
var/dog_area = get_area(src)
|
||||
for(var/obj/structure/bed/dogbed/D in dog_area)
|
||||
if(!D.owner)
|
||||
D.update_owner(src)
|
||||
break
|
||||
|
||||
/mob/living/simple_animal/pet/dog/corgi/Initialize()
|
||||
..()
|
||||
regenerate_icons()
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
environment_smash = initial(environment_smash)
|
||||
alpha = 255
|
||||
range = initial(range)
|
||||
incorporeal_move = 0
|
||||
incorporeal_move = FALSE
|
||||
to_chat(src, "<span class='danger'><B>You switch to combat mode.</span></B>")
|
||||
toggle = FALSE
|
||||
else
|
||||
@@ -48,7 +48,7 @@
|
||||
environment_smash = ENVIRONMENT_SMASH_NONE
|
||||
alpha = 45
|
||||
range = 255
|
||||
incorporeal_move = 1
|
||||
incorporeal_move = INCORPOREAL_MOVE_BASIC
|
||||
to_chat(src, "<span class='danger'><B>You switch to scout mode.</span></B>")
|
||||
toggle = TRUE
|
||||
else
|
||||
|
||||
@@ -193,6 +193,7 @@ Difficulty: Medium
|
||||
return
|
||||
animate(src, transform = matrix()*0.7, time = 7)
|
||||
swooping |= SWOOP_INVULNERABLE
|
||||
mouse_opacity = 0
|
||||
sleep(7)
|
||||
var/list/flame_hit = list()
|
||||
while(swoop_duration > 0)
|
||||
@@ -233,6 +234,7 @@ Difficulty: Medium
|
||||
animate(src, transform = oldtransform, time = 5)
|
||||
sleep(5)
|
||||
swooping &= ~SWOOP_INVULNERABLE
|
||||
mouse_opacity = initial(mouse_opacity)
|
||||
icon_state = "dragon"
|
||||
playsound(src.loc, 'sound/effects/meteorimpact.ogg', 200, 1)
|
||||
for(var/mob/living/L in orange(1, src))
|
||||
|
||||
@@ -948,7 +948,7 @@
|
||||
color = "#FFFFFF77"
|
||||
speak_chance = 20
|
||||
status_flags = GODMODE
|
||||
incorporeal_move = 1
|
||||
incorporeal_move = INCORPOREAL_MOVE_BASIC
|
||||
butcher_results = list(/obj/item/weapon/ectoplasm = 1)
|
||||
|
||||
/mob/living/simple_animal/parrot/Poly/ghost/Initialize()
|
||||
|
||||
@@ -209,10 +209,10 @@
|
||||
return
|
||||
var/mob/living/L = mob
|
||||
switch(L.incorporeal_move)
|
||||
if(1)
|
||||
if(INCORPOREAL_MOVE_BASIC)
|
||||
L.loc = get_step(L, direct)
|
||||
L.setDir(direct)
|
||||
if(2)
|
||||
if(INCORPOREAL_MOVE_SHADOW)
|
||||
if(prob(50))
|
||||
var/locx
|
||||
var/locy
|
||||
@@ -250,7 +250,7 @@
|
||||
new /obj/effect/temp_visual/dir_setting/ninja/shadow(mobloc, L.dir)
|
||||
L.loc = get_step(L, direct)
|
||||
L.setDir(direct)
|
||||
if(3) //Incorporeal move, but blocked by holy-watered tiles and salt piles.
|
||||
if(INCORPOREAL_MOVE_JAUNT) //Incorporeal move, but blocked by holy-watered tiles and salt piles.
|
||||
var/turf/open/floor/stepTurf = get_step(L, direct)
|
||||
for(var/obj/effect/decal/cleanable/salt/S in stepTurf)
|
||||
to_chat(L, "<span class='warning'>[S] bars your passage!</span>")
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
var/_has_battery = 0
|
||||
var/_has_ai = 0
|
||||
|
||||
/obj/machinery/modular_computer/console/preset/New()
|
||||
/obj/machinery/modular_computer/console/preset/Initialize()
|
||||
. = ..()
|
||||
if(!cpu)
|
||||
return
|
||||
|
||||
@@ -27,15 +27,13 @@
|
||||
|
||||
var/obj/item/device/modular_computer/processor/cpu = null // CPU that handles most logic while this type only handles power and other specific things.
|
||||
|
||||
/obj/machinery/modular_computer/New()
|
||||
..()
|
||||
/obj/machinery/modular_computer/Initialize()
|
||||
. = ..()
|
||||
cpu = new(src)
|
||||
cpu.physical = src
|
||||
|
||||
/obj/machinery/modular_computer/Destroy()
|
||||
if(cpu)
|
||||
qdel(cpu)
|
||||
cpu = null
|
||||
QDEL_NULL(cpu)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/modular_computer/attack_ghost(mob/dead/observer/user)
|
||||
|
||||
@@ -20,8 +20,8 @@
|
||||
max_integrity = 300
|
||||
integrity_failure = 150
|
||||
|
||||
/obj/machinery/modular_computer/console/buildable/New()
|
||||
..()
|
||||
/obj/machinery/modular_computer/console/buildable/Initialize()
|
||||
. = ..()
|
||||
// User-built consoles start as empty frames.
|
||||
var/obj/item/weapon/computer_hardware/hard_drive/hard_drive = cpu.all_components[MC_HDD]
|
||||
var/obj/item/weapon/computer_hardware/hard_drive/network_card = cpu.all_components[MC_NET]
|
||||
@@ -30,8 +30,8 @@
|
||||
qdel(network_card)
|
||||
qdel(hard_drive)
|
||||
|
||||
/obj/machinery/modular_computer/console/New()
|
||||
..()
|
||||
/obj/machinery/modular_computer/console/Initialize()
|
||||
. = ..()
|
||||
var/obj/item/weapon/computer_hardware/battery/battery_module = cpu.all_components[MC_CELL]
|
||||
if(battery_module)
|
||||
qdel(battery_module)
|
||||
|
||||
@@ -66,9 +66,8 @@ By design, d1 is the smallest direction and d2 is the highest
|
||||
icon = 'icons/obj/power_cond/power_cond_white.dmi'
|
||||
|
||||
// the power cable object
|
||||
/obj/structure/cable/New()
|
||||
..()
|
||||
|
||||
/obj/structure/cable/Initialize()
|
||||
. = ..()
|
||||
|
||||
// ensure d1 & d2 reflect the icon_state for entering and exiting cable
|
||||
var/dash = findtext(icon_state, "-")
|
||||
@@ -529,7 +528,7 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe("cable restrai
|
||||
return(OXYLOSS)
|
||||
|
||||
/obj/item/stack/cable_coil/New(loc, new_amount = null, var/param_color = null)
|
||||
..()
|
||||
. = ..()
|
||||
if(new_amount) // MAXCOIL by default
|
||||
amount = new_amount
|
||||
if(param_color)
|
||||
|
||||
@@ -30,7 +30,7 @@ GLOBAL_LIST_EMPTY(rad_collectors)
|
||||
/obj/machinery/power/rad_collector/process()
|
||||
if(loaded_tank)
|
||||
if(!loaded_tank.air_contents.gases["plasma"])
|
||||
investigate_log("<font color='red'>out of fuel</font>.", INVESTIGATE_SINGULO)
|
||||
investigate_log("<font color='red'>out of fuel</font>.", INVESTIGATE_SINGULO)
|
||||
eject()
|
||||
else
|
||||
loaded_tank.air_contents.gases["plasma"][MOLES] -= 0.001*drainratio
|
||||
@@ -46,9 +46,11 @@ GLOBAL_LIST_EMPTY(rad_collectors)
|
||||
toggle_power()
|
||||
user.visible_message("[user.name] turns the [src.name] [active? "on":"off"].", \
|
||||
"<span class='notice'>You turn the [src.name] [active? "on":"off"].</span>")
|
||||
var/fuel = loaded_tank.air_contents.gases["plasma"]
|
||||
var/fuel
|
||||
if(loaded_tank)
|
||||
fuel = loaded_tank.air_contents.gases["plasma"]
|
||||
fuel = fuel ? fuel[MOLES] : 0
|
||||
investigate_log("turned [active?"<font color='green'>on</font>":"<font color='red'>off</font>"] by [user.key]. [loaded_tank?"Fuel: [round(fuel/0.29)]%":"<font color='red'>It is empty</font>"].", INVESTIGATE_SINGULO)
|
||||
investigate_log("turned [active?"<font color='green'>on</font>":"<font color='red'>off</font>"] by [user.key]. [loaded_tank?"Fuel: [round(fuel/0.29)]%":"<font color='red'>It is empty</font>"].", INVESTIGATE_SINGULO)
|
||||
return
|
||||
else
|
||||
to_chat(user, "<span class='warning'>The controls are locked!</span>")
|
||||
@@ -73,28 +75,34 @@ GLOBAL_LIST_EMPTY(rad_collectors)
|
||||
/obj/machinery/power/rad_collector/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/device/multitool))
|
||||
to_chat(user, "<span class='notice'>The [W.name] detects that [last_power]W were recently produced.</span>")
|
||||
return 1
|
||||
return TRUE
|
||||
else if(istype(W, /obj/item/device/analyzer) && loaded_tank)
|
||||
atmosanalyzer_scan(loaded_tank.air_contents, user)
|
||||
else if(istype(W, /obj/item/weapon/tank/internals/plasma))
|
||||
if(!anchored)
|
||||
to_chat(user, "<span class='warning'>The [src] needs to be secured to the floor first!</span>")
|
||||
return 1
|
||||
return TRUE
|
||||
if(loaded_tank)
|
||||
to_chat(user, "<span class='warning'>There's already a plasma tank loaded!</span>")
|
||||
return 1
|
||||
return TRUE
|
||||
if(!user.drop_item())
|
||||
return 1
|
||||
return TRUE
|
||||
loaded_tank = W
|
||||
W.forceMove(src)
|
||||
update_icons()
|
||||
else if(istype(W, /obj/item/weapon/crowbar))
|
||||
if(loaded_tank && !locked)
|
||||
if(loaded_tank)
|
||||
if(locked)
|
||||
to_chat(user, "<span class='warning'>The controls are locked!</span>")
|
||||
return TRUE
|
||||
eject()
|
||||
return 1
|
||||
return TRUE
|
||||
else
|
||||
to_chat(user, "<span class='warning'>There isn't a tank loaded!</span>")
|
||||
return TRUE
|
||||
else if(istype(W, /obj/item/weapon/wrench))
|
||||
default_unfasten_wrench(user, W, 0)
|
||||
return 1
|
||||
return TRUE
|
||||
else if(W.GetID())
|
||||
if(allowed(user))
|
||||
if(active)
|
||||
@@ -104,7 +112,7 @@ GLOBAL_LIST_EMPTY(rad_collectors)
|
||||
to_chat(user, "<span class='warning'>The controls can only be locked when \the [src] is active!</span>")
|
||||
else
|
||||
to_chat(user, "<span class='danger'>Access denied.</span>")
|
||||
return 1
|
||||
return TRUE
|
||||
else
|
||||
return ..()
|
||||
|
||||
@@ -141,11 +149,11 @@ GLOBAL_LIST_EMPTY(rad_collectors)
|
||||
/obj/machinery/power/rad_collector/proc/update_icons()
|
||||
cut_overlays()
|
||||
if(loaded_tank)
|
||||
add_overlay("ptank")
|
||||
add_overlay("ptank")
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
return
|
||||
if(active)
|
||||
add_overlay("on")
|
||||
add_overlay("on")
|
||||
|
||||
|
||||
/obj/machinery/power/rad_collector/proc/toggle_power()
|
||||
|
||||
@@ -295,14 +295,16 @@
|
||||
/obj/item/weapon/gun/attack(mob/M as mob, mob/user)
|
||||
if(user.a_intent == INTENT_HARM) //Flogging
|
||||
if(bayonet)
|
||||
bayonet.attack(M, user)
|
||||
M.attackby(bayonet, user)
|
||||
return
|
||||
return ..()
|
||||
else
|
||||
return ..()
|
||||
return
|
||||
|
||||
/obj/item/weapon/gun/attack_obj(obj/O, mob/user)
|
||||
if(user.a_intent == INTENT_HARM)
|
||||
if(bayonet)
|
||||
bayonet.attack_obj(O, user)
|
||||
O.attackby(bayonet, user)
|
||||
return
|
||||
return ..()
|
||||
|
||||
@@ -332,7 +334,7 @@
|
||||
if(!bayonet)
|
||||
if(!user.transferItemToLoc(I, src))
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You attach \the [K] to the front of ]the [src].</span>")
|
||||
to_chat(user, "<span class='notice'>You attach \the [K] to the front of \the [src].</span>")
|
||||
bayonet = K
|
||||
update_icon()
|
||||
else if(istype(I, /obj/item/weapon/screwdriver))
|
||||
|
||||
@@ -294,10 +294,11 @@
|
||||
/obj/item/bodypart/head/attach_limb(mob/living/carbon/C, special)
|
||||
//Transfer some head appearance vars over
|
||||
if(brain)
|
||||
brainmob.container = null //Reset brainmob head var.
|
||||
brainmob.loc = brain //Throw mob into brain.
|
||||
brain.brainmob = brainmob //Set the brain to use the brainmob
|
||||
brainmob = null //Set head brainmob var to null
|
||||
if(brainmob)
|
||||
brainmob.container = null //Reset brainmob head var.
|
||||
brainmob.loc = brain //Throw mob into brain.
|
||||
brain.brainmob = brainmob //Set the brain to use the brainmob
|
||||
brainmob = null //Set head brainmob var to null
|
||||
brain.Insert(C) //Now insert the brain proper
|
||||
brain = null //No more brain in the head
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
/datum/language/common,
|
||||
/datum/language/draconic,
|
||||
/datum/language/monkey,
|
||||
/datum/language/beachbum,
|
||||
/datum/language/narsie,
|
||||
))
|
||||
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
diff a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm (rejected hunks)
|
||||
@@ -17,6 +17,7 @@
|
||||
/datum/language/codespeak,
|
||||
/datum/language/monkey,
|
||||
/datum/language/narsie,
|
||||
+ /datum/language/beachbum,
|
||||
/datum/language/ratvar
|
||||
))
|
||||
|
||||
@@ -35,6 +35,7 @@
|
||||
icon_state = "speedwagon"
|
||||
layer = LYING_MOB_LAYER
|
||||
overlay_state = "speedwagon_cover"
|
||||
max_buckled_mobs = 4
|
||||
var/crash_all = FALSE //CHAOS
|
||||
pixel_y = -48 //to fix the offset when Initialized()
|
||||
pixel_x = -48
|
||||
|
||||
Reference in New Issue
Block a user