Merge pull request #2775 from VOREStation/syncomatic

Polaris Sync
This commit is contained in:
Arokha Sieyes
2018-01-17 18:36:35 -05:00
committed by GitHub
280 changed files with 20362 additions and 2215 deletions
+35
View File
@@ -0,0 +1,35 @@
/obj/item/weapon/banner
name = "banner"
icon = 'icons/obj/items.dmi'
icon_state = "banner"
desc = "A banner that's invisible because it shouldn't exist."
/obj/item/weapon/banner/red
name = "red banner"
icon_state = "banner-red"
desc = "A red colored banner."
/obj/item/weapon/banner/blue
name = "blue banner"
icon_state = "banner-blue"
desc = "A blue colored banner."
/obj/item/weapon/banner/green
name = "green banner"
icon_state = "banner-green"
desc = "A green colored banner."
/obj/item/weapon/banner/nt
name = "\improper NanoTrasen banner"
icon_state = "banner-nt"
desc = "A banner with NanoTrasen's logo on it."
/obj/item/weapon/banner/solgov
name = "\improper SolGov banner"
icon_state = "banner-solgov"
desc = "A banner with the symbol of the Solar Confederate Government."
/obj/item/weapon/banner/virgov
name = "\improper VirGov banner"
icon_state = "banner-virgov"
desc = "A banner with the symbol of the local government, the Vir Governmental Authority, also known as SifGov."
+81 -32
View File
@@ -6,26 +6,44 @@
var/buckle_dir = 0
var/buckle_lying = -1 //bed-like behavior, forces mob.lying = buckle_lying if != -1
var/buckle_require_restraints = 0 //require people to be handcuffed before being able to buckle. eg: pipes
var/mob/living/buckled_mob = null
// var/mob/living/buckled_mob = null
var/list/mob/living/buckled_mobs = null //list()
var/max_buckled_mobs = 1
/atom/movable/attack_hand(mob/living/user)
. = ..()
if(can_buckle && buckled_mob)
user_unbuckle_mob(user)
// if(can_buckle && buckled_mob)
// user_unbuckle_mob(user)
if(can_buckle && has_buckled_mobs())
if(buckled_mobs.len > 1)
var/unbuckled = input(user, "Who do you wish to unbuckle?","Unbuckle Who?") as null|mob in buckled_mobs
if(user_unbuckle_mob(unbuckled, user))
return TRUE
else
if(user_unbuckle_mob(buckled_mobs[1], user))
return TRUE
/obj/proc/attack_alien(mob/user as mob) //For calling in the event of Xenomorph or other alien checks.
return
/obj/attack_robot(mob/living/user)
if(Adjacent(user) && buckled_mob) //Checks if what we're touching is adjacent to us and has someone buckled to it. This should prevent interacting with anti-robot manual valves among other things.
if(Adjacent(user) && has_buckled_mobs()) //Checks if what we're touching is adjacent to us and has someone buckled to it. This should prevent interacting with anti-robot manual valves among other things.
return attack_hand(user) //Process as if we're a normal person touching the object.
return ..() //Otherwise, treat this as an AI click like usual.
/atom/movable/MouseDrop_T(mob/living/M, mob/living/user)
. = ..()
if(can_buckle && istype(M))
user_buckle_mob(M, user)
if(user_buckle_mob(M, user))
return TRUE
/atom/movable/proc/has_buckled_mobs()
if(!buckled_mobs)
return FALSE
if(buckled_mobs.len)
return TRUE
/atom/movable/Destroy()
unbuckle_mob()
@@ -33,52 +51,81 @@
/atom/movable/proc/buckle_mob(mob/living/M, forced = FALSE, check_loc = TRUE)
if((!can_buckle && !forced) || !istype(M) || M.buckled || M.pinned.len || (buckle_require_restraints && !M.restrained()))
return 0
if(!buckled_mobs)
buckled_mobs = list()
if(!istype(M))
return FALSE
if(check_loc && M.loc != loc)
return 0
if(buckled_mob) //Handles trying to buckle yourself to the chair when someone is on it
M << "<span class='notice'>\The [src] already has someone buckled to it.</span>"
return 0
return FALSE
if((!can_buckle && !forced) || M.buckled || M.pinned.len || (buckled_mobs.len >= max_buckled_mobs) || (buckle_require_restraints && !M.restrained()))
return FALSE
if(has_buckled_mobs() && buckled_mobs.len >= max_buckled_mobs) //Handles trying to buckle yourself to the chair when someone is on it
to_chat(M, "<span class='notice'>\The [src] can't buckle anymore people.</span>")
return FALSE
M.buckled = src
M.facing_dir = null
M.set_dir(buckle_dir ? buckle_dir : dir)
M.update_canmove()
M.update_floating( M.Check_Dense_Object() )
buckled_mob = M
// buckled_mob = M
buckled_mobs |= M
post_buckle_mob(M)
return 1
return TRUE
/atom/movable/proc/unbuckle_mob(mob/living/buckled_mob, force = FALSE)
if(!buckled_mob) // If we didn't get told which mob needs to get unbuckled, just assume its the first one on the list.
if(has_buckled_mobs())
buckled_mob = buckled_mobs[1]
else
return
/atom/movable/proc/unbuckle_mob()
if(buckled_mob && buckled_mob.buckled == src)
. = buckled_mob
buckled_mob.buckled = null
buckled_mob.anchored = initial(buckled_mob.anchored)
buckled_mob.update_canmove()
buckled_mob.update_floating( buckled_mob.Check_Dense_Object() )
buckled_mob = null
// buckled_mob = null
buckled_mobs -= buckled_mob
post_buckle_mob(.)
/atom/movable/proc/unbuckle_all_mobs(force = FALSE)
if(!has_buckled_mobs())
return
for(var/m in buckled_mobs)
unbuckle_mob(m, force)
//Handle any extras after buckling/unbuckling
//Called on buckle_mob() and unbuckle_mob()
/atom/movable/proc/post_buckle_mob(mob/living/M)
return
//Wrapper procs that handle sanity and user feedback
/atom/movable/proc/user_buckle_mob(mob/living/M, mob/user, var/forced = FALSE, var/silent = FALSE)
if(!ticker)
user << "<span class='warning'>You can't buckle anyone in before the game starts.</span>"
return FALSE // Is this really needed?
if(!user.Adjacent(M) || user.restrained() || user.stat || istype(user, /mob/living/silicon/pai))
return
if(M == buckled_mob)
return
return FALSE
if(M in buckled_mobs)
to_chat(user, "<span class='warning'>\The [M] is already buckled to \the [src].</span>")
return FALSE
add_fingerprint(user)
unbuckle_mob()
// unbuckle_mob()
//can't buckle unless you share locs so try to move M to the obj.
if(M.loc != src.loc)
step_towards(M, src)
if(M.Adjacent(src) && user.Adjacent(src))
M.forceMove(get_turf(src))
// step_towards(M, src)
. = buckle_mob(M, forced)
if(.)
@@ -94,8 +141,8 @@
"<span class='danger'>You are buckled to [src] by [user.name]!</span>",\
"<span class='notice'>You hear metal clanking.</span>")
/atom/movable/proc/user_unbuckle_mob(mob/user)
var/mob/living/M = unbuckle_mob()
/atom/movable/proc/user_unbuckle_mob(mob/living/buckled_mob, mob/user)
var/mob/living/M = unbuckle_mob(buckled_mob)
if(M)
if(M != user)
M.visible_message(\
@@ -111,18 +158,20 @@
return M
/atom/movable/proc/handle_buckled_mob_movement(newloc,direct)
if(buckled_mob)
// if(!buckled_mob.Move(newloc, direct))
if(!buckled_mob.forceMove(newloc, direct))
loc = buckled_mob.loc
last_move = buckled_mob.last_move
buckled_mob.inertia_dir = last_move
return FALSE
else
buckled_mob.set_dir(dir)
if(has_buckled_mobs())
for(var/A in buckled_mobs)
var/mob/living/L = A
// if(!L.Move(newloc, direct))
if(!L.forceMove(newloc, direct))
loc = L.loc
last_move = L.last_move
L.inertia_dir = last_move
return FALSE
else
L.set_dir(dir)
return TRUE
/atom/movable/Move(atom/newloc, direct = 0)
. = ..()
if(. && buckled_mob && !handle_buckled_mob_movement(newloc, direct)) //movement failed due to buckled mob(s)
if(. && has_buckled_mobs() && !handle_buckled_mob_movement(newloc, direct)) //movement failed due to buckled mob(s)
. = 0
@@ -6,7 +6,7 @@
anchored = 1
var/amount = 1
/obj/effect/decal/cleanable/liquid_fuel/New(turf/newLoc,amt=1,nologs=0)
/obj/effect/decal/cleanable/liquid_fuel/New(turf/newLoc,amt=1,nologs=1)
if(!nologs)
message_admins("Liquid fuel has spilled in [newLoc.loc.name] ([newLoc.x],[newLoc.y],[newLoc.z]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[newLoc.x];Y=[newLoc.y];Z=[newLoc.z]'>JMP</a>)")
log_game("Liquid fuel has spilled in [newLoc.loc.name] ([newLoc.x],[newLoc.y],[newLoc.z])")
+23 -3
View File
@@ -7,6 +7,19 @@
density = 1
anchored = 0
/obj/effect/temporary_effect
name = "self deleting effect"
desc = "How are you examining what which cannot be seen?"
icon = 'icons/effects/effects.dmi'
invisibility = 0
var/time_to_die = 10 SECONDS // Afer which, it will delete itself.
/obj/effect/temporary_effect/New()
..()
if(time_to_die)
spawn(time_to_die)
qdel(src)
// Shown really briefly when attacking with axes.
/obj/effect/temporary_effect/cleave_attack
name = "cleaving attack"
@@ -16,12 +29,19 @@
layer = 6
time_to_die = 6
alpha = 140
invisibility = 0
mouse_opacity = 0
new_light_range = 0
new_light_power = 0
pixel_x = -32
pixel_y = -32
/obj/effect/temporary_effect/cleave_attack/initialize() // Makes the slash fade smoothly. When completely transparent it should qdel itself.
animate(src, alpha = 0, time = time_to_die - 1)
/obj/effect/temporary_effect/shuttle_landing
name = "shuttle landing"
desc = "You better move if you don't want to go splat!"
icon_state = "shuttle_warning_still"
time_to_die = 4.9 SECONDS
/obj/effect/temporary_effect/shuttle_landing/initialize()
flick("shuttle_warning", src) // flick() forces the animation to always begin at the start.
..()
+1 -1
View File
@@ -158,7 +158,7 @@ var/global/list/tele_landmarks = list() // Terrible, but the alternative is loop
var/safety = 100 // Infinite loop protection.
while(!T && safety)
var/turf/simulated/candidate = pick(planet.planet_floors)
if(!istype(candidate) || istype(candidate, /turf/simulated/sky))
if(!istype(candidate) || istype(candidate, /turf/simulated/sky) || !T.outdoors)
safety--
continue
else
+3 -1
View File
@@ -234,7 +234,9 @@
// apparently called whenever an item is removed from a slot, container, or anything else.
/obj/item/proc/dropped(mob/user as mob)
..()
if(zoom) zoom() //binoculars, scope, etc
if(zoom)
zoom() //binoculars, scope, etc
appearance_flags &= ~NO_CLIENT_COLOR
// called just as an item is picked up (loc is not yet changed)
/obj/item/proc/pickup(mob/user)
@@ -108,6 +108,7 @@
data["note"] = note // current notes
data["weather"] = weather
data["aircontents"] = src.analyze_air()
data["flashlight"] = fon
data["injection"] = injection
// update the ui if it exists, returns null if no ui is passed/found
@@ -245,5 +246,9 @@
note = ""
notehtml = note
if(href_list["Light"])
fon = !fon
set_light(fon * flum)
nanomanager.update_uis(src)
add_fingerprint(usr)
@@ -32,6 +32,9 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
var/notehtml = ""
var/obj/item/weapon/cartridge/cartridge = null //current cartridge
var/fon = 0 // Internal light
var/flum = 2 // Brightness
var/list/modules = list(
list("module" = "Phone", "icon" = "phone64", "number" = 2),
list("module" = "Contacts", "icon" = "person64", "number" = 3),
@@ -321,7 +321,7 @@
w_class = ITEMSIZE_SMALL
brightness_on = 8 // Pretty bright.
light_power = 3
light_color = "#e58775"
light_color = LIGHT_COLOR_FLARE
icon_state = "flare"
item_state = "flare"
action_button_name = null //just pull it manually, neckbeard.
+1 -1
View File
@@ -195,7 +195,7 @@ var/list/GPS_list = list()
tracking = TRUE // On by default.
/obj/item/device/gps/internal // Base type for immobile/internal GPS units.
icon_state = null
icon_state = "internal"
gps_tag = "Eerie Signal"
desc = "Report to a coder immediately."
invisibility = INVISIBILITY_MAXIMUM
+1 -1
View File
@@ -44,4 +44,4 @@
icon = 'icons/obj/abductor.dmi'
icon_state = "multitool"
toolspeed = 0.1
origin_tech = list(TECH_MAGNETS = 5, TECH_ENGINEERING = 5)
origin_tech = list(TECH_MAGNET = 5, TECH_ENGINEERING = 5)
+6 -4
View File
@@ -19,13 +19,15 @@
/obj/item/device/uplink/nano_host()
return loc
/obj/item/device/uplink/New(var/location, var/datum/mind/owner, var/telecrystals = DEFAULT_TELECRYSTAL_AMOUNT)
/obj/item/device/uplink/New(var/location, var/datum/mind/owner = null, var/telecrystals = DEFAULT_TELECRYSTAL_AMOUNT)
..()
if(owner) //VOREStation Edit - Owner optional
src.uplink_owner = owner
uses = owner.tcrystals
src.uplink_owner = owner
purchase_log = list()
world_uplinks += src
if(owner)
uses = owner.tcrystals
else
uses = telecrystals
processing_objects += src
/obj/item/device/uplink/Destroy()
@@ -0,0 +1,138 @@
/*****************Marker Beacons**************************/
var/list/marker_beacon_colors = list(
"Random" = FALSE, //not a true color, will pick a random color
"Burgundy" = LIGHT_COLOR_FLARE,
"Bronze" = LIGHT_COLOR_ORANGE,
"Yellow" = LIGHT_COLOR_YELLOW,
"Lime" = LIGHT_COLOR_SLIME_LAMP,
"Olive" = LIGHT_COLOR_GREEN,
"Jade" = LIGHT_COLOR_BLUEGREEN,
"Teal" = LIGHT_COLOR_LIGHT_CYAN,
"Cerulean" = LIGHT_COLOR_BLUE,
"Indigo" = LIGHT_COLOR_DARK_BLUE,
"Purple" = LIGHT_COLOR_PURPLE,
"Violet" = LIGHT_COLOR_LAVENDER,
"Fuchsia" = LIGHT_COLOR_PINK
)
/obj/item/stack/marker_beacon
name = "marker beacons"
singular_name = "marker beacon"
desc = "Prismatic path illumination devices. Used by explorers and miners to mark paths and warn of danger."
description_info = "Use inhand to drop one marker beacon. You can pick them up again with an empty hand or \
hitting them with this marker stack. Alt-click to select a specific color."
icon = 'icons/obj/lighting.dmi'
icon_state = "marker"
max_amount = 100
no_variants = TRUE
var/picked_color = "random"
/obj/item/stack/marker_beacon/ten
amount = 10
/obj/item/stack/marker_beacon/thirty
amount = 30
/obj/item/stack/marker_beacon/hundred
amount = 100
/obj/item/stack/marker_beacon/initialize()
. = ..()
update_icon()
/obj/item/stack/marker_beacon/examine(mob/user)
..()
to_chat(user, "<span class='notice'>Use in-hand to place a [singular_name].</span>")
to_chat(user, "<span class='notice'>Alt-click to select a color. Current color is [picked_color].</span>")
/obj/item/stack/marker_beacon/update_icon()
icon_state = "[initial(icon_state)][lowertext(picked_color)]"
/obj/item/stack/marker_beacon/attack_self(mob/user)
if(!isturf(user.loc))
to_chat(user, "<span class='warning'>You need more space to place a [singular_name] here.</span>")
return
if(locate(/obj/structure/marker_beacon) in user.loc)
to_chat(user, "<span class='warning'>There is already a [singular_name] here.</span>")
return
if(use(1))
to_chat(user, "<span class='notice'>You activate and anchor [amount ? "a":"the"] [singular_name] in place.</span>")
playsound(user, 'sound/machines/click.ogg', 50, 1)
var/obj/structure/marker_beacon/M = new(user.loc, picked_color)
transfer_fingerprints_to(M)
/obj/item/stack/marker_beacon/AltClick(mob/living/user)
if(user.incapacitated() || !istype(user))
to_chat(user, "<span class='warning'>You can't do that right now!</span>")
return
if(!in_range(src, user))
return
var/input_color = input(user, "Choose a color.", "Beacon Color") as null|anything in marker_beacon_colors
if(user.incapacitated() || !istype(user) || !in_range(src, user))
return
if(input_color)
picked_color = input_color
update_icon()
/obj/structure/marker_beacon
name = "marker beacon"
desc = "A prismatic path illumination device. It is anchored in place and glowing steadily."
icon = 'icons/obj/lighting.dmi'
icon_state = "marker"
// layer = BELOW_OPEN_DOOR_LAYER
anchored = TRUE
light_range = 2
light_power = 3
var/remove_speed = 15
var/picked_color
/obj/structure/marker_beacon/New(newloc, set_color)
. = ..()
picked_color = set_color
update_icon()
/obj/structure/marker_beacon/examine(mob/user)
..()
to_chat(user, "<span class='notice'>Alt-click to select a color. Current color is [picked_color].</span>")
/obj/structure/marker_beacon/update_icon()
while(!picked_color || !marker_beacon_colors[picked_color])
picked_color = pick(marker_beacon_colors)
icon_state = "[initial(icon_state)][lowertext(picked_color)]-on"
set_light(light_range, light_power, marker_beacon_colors[picked_color])
/obj/structure/marker_beacon/attack_hand(mob/living/user)
to_chat(user, "<span class='notice'>You start picking [src] up...</span>")
if(do_after(user, remove_speed, target = src))
var/obj/item/stack/marker_beacon/M = new(loc)
M.picked_color = picked_color
M.update_icon()
transfer_fingerprints_to(M)
if(user.put_in_hands(M, TRUE)) //delete the beacon if it fails
playsound(src, 'sound/items/deconstruct.ogg', 50, 1)
qdel(src) //otherwise delete us
/obj/structure/marker_beacon/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/stack/marker_beacon))
var/obj/item/stack/marker_beacon/M = I
to_chat(user, "<span class='notice'>You start picking [src] up...</span>")
if(do_after(user, remove_speed, target = src) && M.amount + 1 <= M.max_amount)
M.add(1)
playsound(src, 'sound/items/deconstruct.ogg', 50, 1)
qdel(src)
else
return ..()
/obj/structure/marker_beacon/AltClick(mob/living/user)
..()
if(user.incapacitated() || !istype(user))
to_chat(user, "<span class='warning'>You can't do that right now!</span>")
return
if(!in_range(src, user))
return
var/input_color = input(user, "Choose a color.", "Beacon Color") as null|anything in marker_beacon_colors
if(user.incapacitated() || !istype(user) || !in_range(src, user))
return
if(input_color)
picked_color = input_color
update_icon()
@@ -101,9 +101,8 @@
//Step one - dehairing.
/obj/item/stack/material/animalhide/attackby(obj/item/weapon/W as obj, mob/user as mob)
if( istype(W, /obj/item/weapon/material/knife) || \
istype(W, /obj/item/weapon/material/kitchen/utensil/knife) || \
istype(W, /obj/item/weapon/material/twohanded/fireaxe) || \
istype(W, /obj/item/weapon/material/hatchet) )
istype(W, /obj/item/weapon/material/knife/machete/hatchet) )
//visible message on mobs is defined as visible_message(var/message, var/self_message, var/blind_message)
usr.visible_message("<span class='notice'>\The [usr] starts cutting hair off \the [src]</span>", "<span class='notice'>You start cutting the hair off \the [src]</span>", "You hear the sound of a knife rubbing against flesh")
@@ -1,19 +1,29 @@
obj/item/weapon/chainsaw
name = "Chainsaw"
name = "chainsaw"
desc = "Vroom vroom."
icon_state = "chainsaw0"
item_state = "chainsaw0"
var/on = 0
var/max_fuel = 20
w_class = ITEMSIZE_LARGE
slot_flags = SLOT_BACK
w_class = ITEMSIZE_LARGE
slot_flags = SLOT_BACK
var/active_force = 55
var/inactive_force = 10
obj/item/weapon/chainsaw/New()
var/datum/reagents/R = new/datum/reagents(max_fuel)
reagents = R
R.my_atom = src
R.add_reagent("fuel", max_fuel)
processing_objects |= src
..()
obj/item/weapon/chainsaw/Destroy()
processing_objects -= src
if(reagents)
qdel(reagents)
..()
obj/item/weapon/chainsaw/proc/turnOn()
@@ -31,7 +41,7 @@ obj/item/weapon/chainsaw/proc/turnOn()
visible_message("You start \the [src] up with a loud grinding!", "[usr] starts \the [src] up with a loud grinding!")
attack_verb = list("shreds", "rips", "tears")
playsound(src, 'sound/weapons/chainsaw_startup.ogg',40,1)
force = 55
force = active_force
edge = 1
sharp = 1
on = 1
@@ -44,7 +54,7 @@ obj/item/weapon/chainsaw/proc/turnOff()
to_chat(usr, "You switch the gas nozzle on the chainsaw, turning it off.")
attack_verb = list("bluntly hit", "beat", "knocked")
playsound(src, 'sound/weapons/chainsaw_turnoff.ogg',40,1)
force = 10
force = inactive_force
edge = 0
sharp = 0
on = 0
@@ -87,12 +97,13 @@ obj/item/weapon/chainsaw/process()
if(on)
if(get_fuel() > 0)
reagents.remove_reagent("fuel", 1)
playsound(src, 'sound/weapons/chainsaw_turnoff.ogg',15,1)
if(get_fuel() <= 0)
to_chat(usr, "\The [src] sputters to a stop!")
on = !on
turnOff()
obj/item/weapon/chainsaw/proc/get_fuel()
reagents.get_reagent_amount("fuel")
return reagents.get_reagent_amount("fuel")
obj/item/weapon/chainsaw/examine(mob/user)
if(..(user,0))
@@ -109,4 +120,4 @@ obj/item/weapon/chainsaw/update_icon()
item_state = "chainsaw1"
else
icon_state = "chainsaw0"
icon_state = "chainsaw0"
item_state = "chainsaw0"
@@ -78,16 +78,10 @@
/*
* Knives
*/
/obj/item/weapon/material/kitchen/utensil/knife
name = "knife"
desc = "A knife for eating with. Can cut through any food."
icon_state = "knife"
force_divisor = 0.1 // 6 when wielded with hardness 60 (steel)
scoop_food = 0
// Identical to the tactical knife but nowhere near as stabby.
// Kind of like the toy esword compared to the real thing.
/obj/item/weapon/material/kitchen/utensil/knife/boot
/obj/item/weapon/material/knife/boot
name = "boot knife"
desc = "A small fixed-blade knife for putting inside a boot."
icon = 'icons/obj/weapons.dmi'
@@ -95,14 +89,15 @@
item_state = "knife"
applies_material_colour = 0
/obj/item/weapon/material/kitchen/utensil/knife/attack(target as mob, mob/living/user as mob)
/* From the time of Clowns. Commented out for posterity, and sanity.
/obj/item/weapon/material/knife/attack(target as mob, mob/living/user as mob)
if ((CLUMSY in user.mutations) && prob(50))
user << "<span class='warning'>You accidentally cut yourself with \the [src].</span>"
user.take_organ_damage(20)
return
return ..()
/obj/item/weapon/material/kitchen/utensil/knife/plastic
*/
/obj/item/weapon/material/knife/plastic
default_material = "plastic"
/*
@@ -87,17 +87,30 @@
/obj/item/weapon/material/knife/butch
name = "butcher's cleaver"
icon = 'icons/obj/kitchen.dmi'
icon_state = "butch"
desc = "A huge thing used for chopping and chopping up meat. This includes clowns and clown-by-products."
force_divisor = 0.25 // 15 when wielded with hardness 60 (steel)
attack_verb = list("cleaved", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
/obj/item/weapon/material/hatchet/tacknife/survival
/obj/item/weapon/material/knife/machete
name = "machete"
desc = "A sharp machete often found in survival kits."
icon_state = "machete"
force_divisor = 0.3 // 20 when hardness 60 (steel)
attack_verb = list("slashed", "chopped", "gouged", "ripped", "cut")
var/should_cleave = TRUE //Now hatchets inherit from the machete, and thus knives. Tables turned.
// This cannot go into afterattack since some mobs delete themselves upon dying.
/obj/item/weapon/material/knife/machete/pre_attack(var/mob/living/target, var/mob/living/user)
if(should_cleave && istype(target))
cleave(user, target)
..()
/obj/item/weapon/material/knife/tacknife/survival
name = "survival knife"
desc = "A hunting grade survival knife."
icon = 'icons/obj/kitchen.dmi'
icon_state = "survivalknife"
item_state = "knife"
applies_material_colour = FALSE
should_cleave = FALSE
toolspeed = 2 // Use a real axe if you want to chop logs.
@@ -19,7 +19,7 @@
attack_verb = list("punched", "beaten", "struck")
applies_material_colour = 0
/obj/item/weapon/material/hatchet
/obj/item/weapon/material/knife/machete/hatchet
name = "hatchet"
desc = "A very sharp axe blade upon a short fibremetal handle. It has a long history of chopping things, but now it is used for chopping wood."
icon = 'icons/obj/weapons.dmi'
@@ -32,15 +32,8 @@
origin_tech = list(TECH_MATERIAL = 2, TECH_COMBAT = 1)
attack_verb = list("chopped", "torn", "cut")
applies_material_colour = 0
var/should_cleave = TRUE // Because knives inherit from hatchets. For some reason.
// This cannot go into afterattack since some mobs delete themselves upon dying.
/obj/item/weapon/material/hatchet/pre_attack(var/mob/living/target, var/mob/living/user)
if(should_cleave && istype(target))
cleave(user, target)
..()
/obj/item/weapon/material/hatchet/unathiknife
/obj/item/weapon/material/knife/machete/hatchet/unathiknife
name = "duelling knife"
desc = "A length of leather-bound wood studded with razor-sharp teeth. How crude."
icon = 'icons/obj/weapons.dmi'
@@ -49,23 +42,23 @@
should_cleave = FALSE
var hits = 0
/obj/item/weapon/material/hatchet/unathiknife/attack(mob/M as mob, mob/user as mob)
/obj/item/weapon/material/knife/machete/hatchet/unathiknife/attack(mob/M as mob, mob/user as mob)
if(hits > 0)
return
var/obj/item/I = user.get_inactive_hand()
if(istype(I, /obj/item/weapon/material/hatchet/unathiknife))
if(istype(I, /obj/item/weapon/material/knife/machete/hatchet/unathiknife))
hits ++
var/obj/item/weapon/W = I
W.attack(M, user)
W.afterattack(M, user)
..()
/obj/item/weapon/material/hatchet/unathiknife/afterattack(mob/M as mob, mob/user as mob)
/obj/item/weapon/material/knife/machete/hatchet/unathiknife/afterattack(mob/M as mob, mob/user as mob)
hits = initial(hits)
..()
// These probably shouldn't inherit from hatchets.
/obj/item/weapon/material/hatchet/tacknife
/obj/item/weapon/material/knife/tacknife
name = "tactical knife"
desc = "You'd be killing loads of people if this was Medal of Valor: Heroes of Space."
icon = 'icons/obj/weapons.dmi'
@@ -73,9 +66,8 @@
item_state = "knife"
attack_verb = list("stabbed", "chopped", "cut")
applies_material_colour = 1
should_cleave = FALSE
/obj/item/weapon/material/hatchet/tacknife/combatknife
/obj/item/weapon/material/knife/tacknife/combatknife
name = "combat knife"
desc = "If only you had a boot to put it in."
icon = 'icons/obj/weapons.dmi'
@@ -85,7 +77,6 @@
thrown_force_divisor = 1.75 // 20 with weight 20 (steel)
attack_verb = list("sliced", "stabbed", "chopped", "cut")
applies_material_colour = 1
should_cleave = FALSE
/obj/item/weapon/material/minihoe // -- Numbers
name = "mini hoe"
@@ -52,7 +52,7 @@
/obj/item/device/radio/headset,
/obj/item/device/robotanalyzer,
/obj/item/weapon/material/minihoe,
/obj/item/weapon/material/hatchet,
/obj/item/weapon/material/knife/machete/hatchet,
/obj/item/device/analyzer/plant_analyzer,
/obj/item/weapon/extinguisher/mini,
/obj/item/weapon/tape_roll,
@@ -160,6 +160,7 @@
/obj/item/weapon/melee,
/obj/item/clothing/accessory/badge,
/obj/item/weapon/gun/projectile/sec,
/obj/item/weapon/gun/projectile/p92x,
/obj/item/taperoll,
/obj/item/weapon/gun/projectile/colt/detective
)
@@ -169,7 +169,7 @@
/obj/item/weapon/storage/box/syndie_kit/g9mm
name = "\improper Smooth operator"
desc = "9mm with silencer kit."
desc = "Compact 9mm with silencer kit."
/obj/item/weapon/storage/box/syndie_kit/g9mm/New()
..()
@@ -7,6 +7,9 @@ var/list/global/tank_gauge_cache = list()
/obj/item/weapon/tank
name = "tank"
icon = 'icons/obj/tank.dmi'
sprite_sheets = list(
"Teshari" = 'icons/mob/species/seromi/back.dmi'
)
var/gauge_icon = "indicator_tank"
var/last_gauge_pressure
+4 -4
View File
@@ -45,7 +45,7 @@
icon_state = "wrench"
usesound = 'sound/effects/empulse.ogg'
toolspeed = 0.1
origin_tech = list(TECH_MATERIAL = 5, TECH_ENGINEER = 5)
origin_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 5)
/obj/item/weapon/wrench/power
name = "hand drill"
@@ -989,9 +989,9 @@
/obj/item/weapon/screwdriver,
/obj/item/weapon/wrench,
/obj/item/weapon/wirecutters,
/obj/item/weapon/material/kitchen/utensil/knife,
/obj/item/weapon/material/knife,
/obj/item/weapon/material/kitchen/utensil/fork,
/obj/item/weapon/material/hatchet
/obj/item/weapon/material/knife/machete/hatchet
)
var/list/tools = list()
var/current_tool = 1
@@ -1036,4 +1036,4 @@
if(tool)
tool.loc = src*/
#undef WELDER_FUEL_BURN_INTERVAL
#undef WELDER_FUEL_BURN_INTERVAL
+8 -6
View File
@@ -42,14 +42,16 @@
anchored = 1
/obj/item/weapon/beartrap/attack_hand(mob/user as mob)
if(buckled_mob && can_use(user))
if(has_buckled_mobs() && can_use(user))
var/victim = english_list(buckled_mobs)
user.visible_message(
"<span class='notice'>[user] begins freeing [buckled_mob] from \the [src].</span>",
"<span class='notice'>You carefully begin to free [buckled_mob] from \the [src].</span>",
"<span class='notice'>[user] begins freeing [victim] from \the [src].</span>",
"<span class='notice'>You carefully begin to free [victim] from \the [src].</span>",
)
if(do_after(user, 60))
user.visible_message("<span class='notice'>[buckled_mob] has been freed from \the [src] by [user].</span>")
unbuckle_mob()
user.visible_message("<span class='notice'>[victim] has been freed from \the [src] by [user].</span>")
for(var/A in buckled_mobs)
unbuckle_mob(A)
anchored = 0
else if(deployed && can_use(user))
user.visible_message(
@@ -109,7 +111,7 @@
"<b>You hear a loud metallic snap!</b>"
)
attack_mob(L)
if(!buckled_mob)
if(!has_buckled_mobs())
anchored = 0
deployed = 0
update_icon()
+18 -16
View File
@@ -111,39 +111,41 @@
processing_objects |= src
/obj/effect/energy_net/Destroy()
if(buckled_mob)
to_chat(buckled_mob,"<span class='notice'>You are free of the net!</span>")
unbuckle_mob()
if(has_buckled_mobs())
for(var/A in buckled_mobs)
to_chat(A,"<span class='notice'>You are free of the net!</span>")
unbuckle_mob(A)
processing_objects -= src
return ..()
/obj/effect/energy_net/process()
if(isnull(buckled_mob) || buckled_mob.loc != loc)
if(!has_buckled_mobs())
qdel(src)
/obj/effect/energy_net/Move()
..()
if(buckled_mob)
var/mob/living/occupant = buckled_mob
occupant.buckled = null
occupant.forceMove(src.loc)
occupant.buckled = src
if (occupant && (src.loc != occupant.loc))
unbuckle_mob()
qdel(src)
if(has_buckled_mobs())
for(var/A in buckled_mobs)
var/mob/living/occupant = A
occupant.buckled = null
occupant.forceMove(src.loc)
occupant.buckled = src
if (occupant && (src.loc != occupant.loc))
unbuckle_mob(occupant)
qdel(src)
/obj/effect/energy_net/user_unbuckle_mob(mob/user)
/obj/effect/energy_net/user_unbuckle_mob(mob/living/buckled_mob, mob/user)
user.setClickCooldown(user.get_attack_speed())
visible_message("<span class='danger'>[user] begins to tear at \the [src]!</span>")
if(do_after(usr, escape_time, src, incapacitation_flags = INCAPACITATION_DEFAULT & ~(INCAPACITATION_RESTRAINED | INCAPACITATION_BUCKLED_FULLY)))
if(!buckled_mob)
if(!has_buckled_mobs())
return
visible_message("<span class='danger'>[user] manages to tear \the [src] apart!</span>")
unbuckle_mob()
unbuckle_mob(buckled_mob)
/obj/effect/energy_net/post_buckle_mob(mob/living/M)
if(buckled_mob) //Just buckled someone
if(M.buckled == src) //Just buckled someone
..()
layer = M.layer+1
M.can_pull_size = 0
+11 -7
View File
@@ -217,7 +217,7 @@
//prob(6);/obj/item/weapon/material/wirerod,
prob(2);/obj/item/weapon/material/butterfly/switchblade,
prob(2);/obj/item/weapon/material/knuckledusters,
prob(1);/obj/item/weapon/material/hatchet/tacknife,
prob(1);/obj/item/weapon/material/knife/tacknife,
prob(1);/obj/item/clothing/suit/storage/vest/heavy/merc,
prob(1);/obj/item/weapon/beartrap,
prob(1);/obj/item/weapon/handcuffs/fuzzy,
@@ -294,7 +294,7 @@
/obj/random/projectile
name = "Random Projectile Weapon"
desc = "This is a random security weapon."
desc = "This is a random projectile weapon."
icon = 'icons/obj/gun.dmi'
icon_state = "revolver"
@@ -315,6 +315,8 @@
prob(3);/obj/item/weapon/gun/projectile/luger/brown,
prob(4);/obj/item/weapon/gun/projectile/sec,
prob(3);/obj/item/weapon/gun/projectile/sec/wood,
prob(4);/obj/item/weapon/gun/projectile/p92x,
prob(3);/obj/item/weapon/gun/projectile/p92x/brown,
prob(4);/obj/item/weapon/gun/projectile/pistol,
prob(5);/obj/item/weapon/gun/projectile/pirate,
prob(2);/obj/item/weapon/gun/projectile/revolver,
@@ -350,13 +352,15 @@
/obj/random/handgun/item_to_spawn()
return pick(prob(4);/obj/item/weapon/gun/projectile/sec,
prob(4);/obj/item/weapon/gun/projectile/luger,
prob(4);/obj/item/weapon/gun/projectile/p92x,
prob(3);/obj/item/weapon/gun/projectile/sec/wood,
prob(3);/obj/item/weapon/gun/projectile/p92x/brown,
prob(3);/obj/item/weapon/gun/projectile/colt,
prob(2);/obj/item/weapon/gun/projectile/luger,
prob(2);/obj/item/weapon/gun/energy/gun,
prob(2);/obj/item/weapon/gun/projectile/colt,
prob(2);/obj/item/weapon/gun/projectile/pistol,
prob(1);/obj/item/weapon/gun/energy/retro,
prob(1);/obj/item/weapon/gun/projectile/sec/wood,
prob(3);/obj/item/weapon/gun/projectile/luger/brown)
prob(1);/obj/item/weapon/gun/projectile/luger/brown)
/obj/random/handgun/sec
name = "Random Security Handgun"
@@ -370,7 +374,7 @@
/obj/random/ammo
name = "Random Ammunition"
desc = "This is random ammunition."
desc = "This is random security ammunition."
icon = 'icons/obj/ammo.dmi'
icon_state = "45-10"
+6 -6
View File
@@ -14,7 +14,7 @@
/obj/structure/bonfire/New(newloc, material_name)
..(newloc)
if(!material_name)
material_name = "wood"
material_name = MAT_WOOD
material = get_material_by_name("[material_name]")
if(!material)
qdel(src)
@@ -23,14 +23,14 @@
// Blue wood.
/obj/structure/bonfire/sifwood/New(newloc, material_name)
..(newloc, "alien wood")
..(newloc, MAT_SIFWOOD)
/obj/structure/bonfire/permanent/New(newloc, material_name)
..()
ignite()
/obj/structure/bonfire/permanent/sifwood/New(newloc, material_name)
..(newloc, "alien wood")
..(newloc, MAT_SIFWOOD)
/obj/structure/bonfire/attackby(obj/item/W, mob/user)
if(istype(W, /obj/item/stack/rods) && !can_buckle && !grill)
@@ -63,7 +63,7 @@
return ..()
/obj/structure/bonfire/attack_hand(mob/user)
if(buckled_mob)
if(has_buckled_mobs())
return ..()
if(get_fuel_amount())
@@ -194,7 +194,7 @@
I.appearance_flags = RESET_COLOR
overlays += I
if(buckled_mob && get_fuel_amount() >= 5)
if(has_buckled_mobs() && get_fuel_amount() >= 5)
I = image(icon, "bonfire_intense")
I.pixel_y = 13
I.layer = MOB_LAYER + 0.1
@@ -231,7 +231,7 @@
extinguish()
/obj/structure/bonfire/post_buckle_mob(mob/living/M)
if(buckled_mob) // Just buckled someone
if(M.buckled == src) // Just buckled someone
M.pixel_y += 13
else // Just unbuckled someone
M.pixel_y -= 13
@@ -22,7 +22,7 @@
new /obj/item/device/radio/headset/headset_service(src)
new /obj/item/clothing/head/greenbandana(src)
new /obj/item/weapon/material/minihoe(src)
new /obj/item/weapon/material/hatchet(src)
new /obj/item/weapon/material/knife/machete/hatchet(src)
new /obj/item/weapon/wirecutters/clippers(src)
new /obj/item/weapon/reagent_containers/spray/plantbgone(src)
new /obj/item/clothing/suit/storage/hooded/wintercoat/hydro(src)
@@ -127,12 +127,16 @@
else
src.toggle(user)
/obj/structure/closet/secure_closet/AltClick()
..()
verb_togglelock()
/obj/structure/closet/secure_closet/verb/verb_togglelock()
set src in oview(1) // One square distance
set category = "Object"
set name = "Toggle Lock"
if(!usr.canmove || usr.stat || usr.restrained()) // Don't use it if you're not able to! Checks for stuns, ghost and restrain
if(!usr.canmove || usr.stat || usr.restrained() || !Adjacent(usr)) // Don't use it if you're not able to! Checks for stuns, ghost and restrain
return
if(ishuman(usr) || isrobot(usr))
@@ -59,7 +59,7 @@
continue
if(istype(O, /obj/structure/bed)) //This is only necessary because of rollerbeds and swivel chairs.
var/obj/structure/bed/B = O
if(B.buckled_mob)
if(B.has_buckled_mobs())
continue
O.forceMove(src)
itemcount++
-3
View File
@@ -1,6 +1,3 @@
#define SHOWER_OPEN_LAYER OBJ_LAYER + 0.4
#define SHOWER_CLOSED_LAYER MOB_LAYER + 0.2
/obj/structure/curtain
name = "curtain"
icon = 'icons/obj/curtain.dmi'
@@ -64,12 +64,14 @@
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(12, 1, src)
s.start()
if(buckled_mob)
buckled_mob.burn_skin(85)
buckled_mob << "<span class='danger'>You feel a deep shock course through your body!</span>"
sleep(1)
buckled_mob.burn_skin(85)
buckled_mob.Stun(600)
if(has_buckled_mobs())
for(var/a in buckled_mobs)
var/mob/living/L = a
L.burn_skin(85)
to_chat(L, "<span class='danger'>You feel a deep shock course through your body!</span>")
sleep(1)
L.burn_skin(85)
L.Stun(600)
visible_message("<span class='danger'>The electric chair went off!</span>", "<span class='danger'>You hear a deep sharp shock!</span>")
A.power_light = light
+2 -41
View File
@@ -306,6 +306,7 @@
/obj/structure/flora/sif/subterranean/initialize()
icon_state = "[initial(icon_state)][rand(1,2)]"
..()
/obj/structure/flora/sif/eyes
name = "mysterious bulbs"
@@ -314,44 +315,4 @@
/obj/structure/flora/sif/eyes/initialize()
icon_state = "[initial(icon_state)][rand(1,3)]"
// VOREStation Edit Start
//Pumpkins
/obj/structure/flora/pumpkin
name = "pumpkin"
icon = 'icons/obj/flora/pumpkins.dmi'
desc = "A healthy, fat pumpkin. It looks as if it was freshly plucked from its vines and shows no signs of decay."
icon_state = "decor-pumpkin"
/obj/effect/landmark/carved_pumpkin_spawn
name = "jack o'lantern spawn"
icon = 'icons/obj/flora/pumpkins.dmi'
icon_state = "spawner-jackolantern"
/obj/effect/landmark/carved_pumpkin_spawn/New()
var/new_pumpkin = pick(
prob(70);/obj/structure/flora/pumpkin,
prob(60);/obj/structure/flora/pumpkin/carved,
prob(30);/obj/structure/flora/pumpkin/carved/scream,
prob(30);/obj/structure/flora/pumpkin/carved/girly,
prob(10);/obj/structure/flora/pumpkin/carved/owo)
new new_pumpkin(src.loc)
..()
/obj/structure/flora/pumpkin/carved
name = "jack o'lantern"
desc = "A fat, freshly picked pumpkin. This one has a face carved into it! This one has develishly evil-looking eyes and a grinning mouth more than big enough for a very small person to hide in."
icon_state = "decor-jackolantern"
/obj/structure/flora/pumpkin/carved/scream
desc = "A fat, freshly picked pumpkin. This one has a face carved into it! This one has rounded eyes looking in completely opposite directions and a wide mouth, forever frozen in a silent scream. It looks ridiculous, actually."
icon_state = "decor-jackolantern-scream"
/obj/structure/flora/pumpkin/carved/girly
desc = "A fat, freshly picked pumpkin. This one has a face carved into it! This one has neatly rounded eyes topped with what appear to be cartoony eyelashes, completed with what seems to have been the carver's attempt at friendly, toothy smile. The mouth is easily the scariest part of its face."
icon_state = "decor-jackolantern-girly"
/obj/structure/flora/pumpkin/carved/owo
desc = "A fat, freshly picked pumpkin. This one has a face carved into it! This one has large, round eyes and a squiggly, cat-like smiling mouth. Its pleasantly surprised expression seems to suggest that the pumpkin has noticed something about you."
icon_state = "decor-jackolantern-owo"
// VOREStation Edit End
..()
+3 -2
View File
@@ -198,5 +198,6 @@
/obj/structure/flora/tree/sif/update_icon()
set_light(5, 1, "#33ccff")
overlays.Cut()
overlays.Add(image(icon = 'icons/obj/flora/deadtrees.dmi', icon_state = "[icon_state]_glow", layer = LIGHTING_LAYER + 0.1))
var/image/glow = image(icon = 'icons/obj/flora/deadtrees.dmi', icon_state = "[icon_state]_glow")
glow.plane = PLANE_LIGHTING_ABOVE
overlays = list(glow)
+38
View File
@@ -0,0 +1,38 @@
//Pumpkins
/obj/structure/flora/pumpkin
name = "pumpkin"
icon = 'icons/obj/flora/pumpkins.dmi'
desc = "A healthy, fat pumpkin. It looks as if it was freshly plucked from its vines and shows no signs of decay."
icon_state = "decor-pumpkin"
/obj/effect/landmark/carved_pumpkin_spawn
name = "jack o'lantern spawn"
icon = 'icons/obj/flora/pumpkins.dmi'
icon_state = "spawner-jackolantern"
/obj/effect/landmark/carved_pumpkin_spawn/New()
var/new_pumpkin = pick(
prob(70);/obj/structure/flora/pumpkin,
prob(60);/obj/structure/flora/pumpkin/carved,
prob(30);/obj/structure/flora/pumpkin/carved/scream,
prob(30);/obj/structure/flora/pumpkin/carved/girly,
prob(10);/obj/structure/flora/pumpkin/carved/owo)
new new_pumpkin(src.loc)
..()
/obj/structure/flora/pumpkin/carved
name = "jack o'lantern"
desc = "A fat, freshly picked pumpkin. This one has a face carved into it! This one has develishly evil-looking eyes and a grinning mouth more than big enough for a very small person to hide in."
icon_state = "decor-jackolantern"
/obj/structure/flora/pumpkin/carved/scream
desc = "A fat, freshly picked pumpkin. This one has a face carved into it! This one has rounded eyes looking in completely opposite directions and a wide mouth, forever frozen in a silent scream. It looks ridiculous, actually."
icon_state = "decor-jackolantern-scream"
/obj/structure/flora/pumpkin/carved/girly
desc = "A fat, freshly picked pumpkin. This one has a face carved into it! This one has neatly rounded eyes topped with what appear to be cartoony eyelashes, completed with what seems to have been the carver's attempt at friendly, toothy smile. The mouth is easily the scariest part of its face."
icon_state = "decor-jackolantern-girly"
/obj/structure/flora/pumpkin/carved/owo
desc = "A fat, freshly picked pumpkin. This one has a face carved into it! This one has large, round eyes and a squiggly, cat-like smiling mouth. Its pleasantly surprised expression seems to suggest that the pumpkin has noticed something about you."
icon_state = "decor-jackolantern-owo"
+32 -25
View File
@@ -4,7 +4,7 @@
icon = 'icons/obj/janitor.dmi'
icon_state = "cart"
anchored = 0
density = 1
density = 1
climbable = 1
flags = OPENCONTAINER
//copypaste sorry
@@ -229,9 +229,11 @@
/obj/structure/bed/chair/janicart/Move()
..()
if(buckled_mob)
if(buckled_mob.buckled == src)
buckled_mob.loc = loc
if(has_buckled_mobs())
for(var/A in buckled_mobs)
var/mob/living/L = A
if(L.buckled == src)
L.loc = loc
/obj/structure/bed/chair/janicart/post_buckle_mob(mob/living/M)
@@ -257,36 +259,41 @@
/obj/structure/bed/chair/janicart/set_dir()
..()
update_layer()
if(buckled_mob)
if(buckled_mob.loc != loc)
buckled_mob.buckled = null //Temporary, so Move() succeeds.
buckled_mob.buckled = src //Restoring
if(has_buckled_mobs())
for(var/A in buckled_mobs)
var/mob/living/L = A
if(L.loc != loc)
L.buckled = null //Temporary, so Move() succeeds.
L.buckled = src //Restoring
update_mob()
/obj/structure/bed/chair/janicart/proc/update_mob()
if(buckled_mob)
buckled_mob.set_dir(dir)
switch(dir)
if(SOUTH)
buckled_mob.pixel_x = 0
buckled_mob.pixel_y = 7
if(WEST)
buckled_mob.pixel_x = 13
buckled_mob.pixel_y = 7
if(NORTH)
buckled_mob.pixel_x = 0
buckled_mob.pixel_y = 4
if(EAST)
buckled_mob.pixel_x = -13
buckled_mob.pixel_y = 7
if(has_buckled_mobs())
for(var/A in buckled_mobs)
var/mob/living/L = A
L.set_dir(dir)
switch(dir)
if(SOUTH)
L.pixel_x = 0
L.pixel_y = 7
if(WEST)
L.pixel_x = 13
L.pixel_y = 7
if(NORTH)
L.pixel_x = 0
L.pixel_y = 4
if(EAST)
L.pixel_x = -13
L.pixel_y = 7
/obj/structure/bed/chair/janicart/bullet_act(var/obj/item/projectile/Proj)
if(buckled_mob)
if(has_buckled_mobs())
if(prob(85))
return buckled_mob.bullet_act(Proj)
var/mob/living/L = pick(buckled_mobs)
return L.bullet_act(Proj)
visible_message("<span class='warning'>[Proj] ricochets off the [callme]!</span>")
+1 -1
View File
@@ -204,7 +204,7 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh
/obj/item/clothing/under/tactical,
/obj/item/weapon/beartrap,
/obj/item/clothing/suit/storage/vest/press,
/obj/item/weapon/material/hatchet/tacknife,
/obj/item/weapon/material/knife/tacknife,
/obj/item/weapon/material/butterfly/switchblade
)
+2 -2
View File
@@ -192,10 +192,10 @@
..(newloc, "diamond")
/obj/structure/simple_door/wood/New(var/newloc,var/material_name)
..(newloc, "wood")
..(newloc, MAT_WOOD)
/obj/structure/simple_door/sifwood/New(var/newloc,var/material_name)
..(newloc, "alien wood")
..(newloc, MAT_SIFWOOD)
/obj/structure/simple_door/resin/New(var/newloc,var/material_name)
..(newloc, "resin")
@@ -10,7 +10,7 @@
/obj/structure/bed/nest/update_icon()
return
/obj/structure/bed/nest/user_unbuckle_mob(mob/user as mob)
/obj/structure/bed/nest/user_unbuckle_mob(mob/living/buckled_mob, mob/user)
if(buckled_mob)
if(buckled_mob.buckled == src)
if(buckled_mob != user)
@@ -20,7 +20,7 @@
"<span class='notice'>You hear squelching...</span>")
buckled_mob.pixel_y = 0
buckled_mob.old_y = 0
unbuckle_mob()
unbuckle_mob(buckled_mob)
else
if(world.time <= buckled_mob.last_special+NEST_RESIST_TIME)
return
@@ -34,7 +34,7 @@
buckled_mob.last_special = world.time
buckled_mob.pixel_y = 0
buckled_mob.old_y = 0
unbuckle_mob()
unbuckle_mob(buckled_mob)
src.add_fingerprint(user)
return
@@ -66,7 +66,7 @@
M.update_canmove()
M.pixel_y = 6
M.old_y = 6
src.buckled_mob = M
src.buckled_mobs |= M
src.add_fingerprint(user)
return
@@ -132,7 +132,7 @@
else if(istype(W, /obj/item/weapon/grab))
var/obj/item/weapon/grab/G = W
var/mob/living/affecting = G.affecting
if(buckled_mob) //Handles trying to buckle someone else to a chair when someone else is on it
if(has_buckled_mobs()) //Handles trying to buckle someone else to a chair when someone else is on it
to_chat(user, "<span class='notice'>\The [src] already has someone buckled to it.</span>")
return
user.visible_message("<span class='notice'>[user] attempts to buckle [affecting] into \the [src]!</span>")
@@ -184,7 +184,7 @@
..(newloc,"wood","cotton")
/obj/structure/bed/double/post_buckle_mob(mob/living/M as mob)
if(M == buckled_mob)
if(M.buckled == src)
M.pixel_y = 13
M.old_y = 13
else
@@ -217,8 +217,9 @@
if(istype(W, /obj/item/weapon/wrench) || istype(W,/obj/item/stack) || istype(W, /obj/item/weapon/wirecutters))
return
else if(istype(W,/obj/item/roller_holder))
if(buckled_mob)
user_unbuckle_mob(user)
if(has_buckled_mobs())
for(var/A in buckled_mobs)
user_unbuckle_mob(A, user)
else
visible_message("[user] collapses \the [src.name].")
new rollertype(get_turf(src))
@@ -288,14 +289,15 @@
/obj/structure/bed/roller/Move()
..()
if(buckled_mob)
if(buckled_mob.buckled == src)
buckled_mob.loc = src.loc
else
buckled_mob = null
if(has_buckled_mobs())
for(var/A in buckled_mobs)
var/mob/living/L = A
if(L.buckled == src)
L.loc = src.loc
/obj/structure/bed/roller/post_buckle_mob(mob/living/M as mob)
if(M == buckled_mob)
if(M.buckled == src)
M.pixel_y = 6
M.old_y = 6
density = 1
@@ -312,7 +314,7 @@
..()
if((over_object == usr && (in_range(src, usr) || usr.contents.Find(src))))
if(!ishuman(usr)) return
if(buckled_mob) return 0
if(has_buckled_mobs()) return 0
visible_message("[usr] collapses \the [src.name].")
new rollertype(get_turf(src))
spawn(0)
@@ -32,7 +32,7 @@
qdel(src)
/obj/structure/bed/chair/attack_tk(mob/user as mob)
if(buckled_mob)
if(has_buckled_mobs())
..()
else
rotate()
@@ -43,7 +43,7 @@
/obj/structure/bed/chair/update_icon()
..()
if(buckled_mob && padding_material)
if(has_buckled_mobs() && padding_material)
var/cache_key = "[base_icon]-armrest-[padding_material.name]"
if(isnull(stool_cache[cache_key]))
var/image/I = image(icon, "[base_icon]_armrest")
@@ -61,8 +61,10 @@
/obj/structure/bed/chair/set_dir()
..()
update_layer()
if(buckled_mob)
buckled_mob.set_dir(dir)
if(has_buckled_mobs())
for(var/A in buckled_mobs)
var/mob/living/L = A
L.set_dir(dir)
/obj/structure/bed/chair/verb/rotate()
set name = "Rotate Chair"
@@ -137,45 +139,47 @@
/obj/structure/bed/chair/office/Move()
..()
if(buckled_mob)
var/mob/living/occupant = buckled_mob
occupant.buckled = null
occupant.Move(src.loc)
occupant.buckled = src
if (occupant && (src.loc != occupant.loc))
if (propelled)
for (var/mob/O in src.loc)
if (O != occupant)
Bump(O)
else
unbuckle_mob()
if(has_buckled_mobs())
for(var/A in buckled_mobs)
var/mob/living/occupant = A
occupant.buckled = null
occupant.Move(src.loc)
occupant.buckled = src
if (occupant && (src.loc != occupant.loc))
if (propelled)
for (var/mob/O in src.loc)
if (O != occupant)
Bump(O)
else
unbuckle_mob()
/obj/structure/bed/chair/office/Bump(atom/A)
..()
if(!buckled_mob) return
if(!has_buckled_mobs()) return
if(propelled)
var/mob/living/occupant = unbuckle_mob()
for(var/a in buckled_mobs)
var/mob/living/occupant = unbuckle_mob(a)
var/def_zone = ran_zone()
var/blocked = occupant.run_armor_check(def_zone, "melee")
var/soaked = occupant.get_armor_soak(def_zone, "melee")
occupant.throw_at(A, 3, propelled)
occupant.apply_effect(6, STUN, blocked)
occupant.apply_effect(6, WEAKEN, blocked)
occupant.apply_effect(6, STUTTER, blocked)
occupant.apply_damage(10, BRUTE, def_zone, blocked, soaked)
playsound(src.loc, 'sound/weapons/punch1.ogg', 50, 1, -1)
if(istype(A, /mob/living))
var/mob/living/victim = A
def_zone = ran_zone()
blocked = victim.run_armor_check(def_zone, "melee")
soaked = victim.get_armor_soak(def_zone, "melee")
victim.apply_effect(6, STUN, blocked)
victim.apply_effect(6, WEAKEN, blocked)
victim.apply_effect(6, STUTTER, blocked)
victim.apply_damage(10, BRUTE, def_zone, blocked, soaked)
occupant.visible_message("<span class='danger'>[occupant] crashed into \the [A]!</span>")
var/def_zone = ran_zone()
var/blocked = occupant.run_armor_check(def_zone, "melee")
var/soaked = occupant.get_armor_soak(def_zone, "melee")
occupant.throw_at(A, 3, propelled)
occupant.apply_effect(6, STUN, blocked)
occupant.apply_effect(6, WEAKEN, blocked)
occupant.apply_effect(6, STUTTER, blocked)
occupant.apply_damage(10, BRUTE, def_zone, blocked, soaked)
playsound(src.loc, 'sound/weapons/punch1.ogg', 50, 1, -1)
if(istype(A, /mob/living))
var/mob/living/victim = A
def_zone = ran_zone()
blocked = victim.run_armor_check(def_zone, "melee")
soaked = victim.get_armor_soak(def_zone, "melee")
victim.apply_effect(6, STUN, blocked)
victim.apply_effect(6, WEAKEN, blocked)
victim.apply_effect(6, STUTTER, blocked)
victim.apply_damage(10, BRUTE, def_zone, blocked, soaked)
occupant.visible_message("<span class='danger'>[occupant] crashed into \the [A]!</span>")
/obj/structure/bed/chair/office/light
icon_state = "officechair_white"
@@ -17,8 +17,10 @@
overlays = null
var/image/O = image(icon = 'icons/obj/furniture.dmi', icon_state = "w_overlay", layer = FLY_LAYER, dir = src.dir)
overlays += O
if(buckled_mob)
buckled_mob.set_dir(dir)
if(has_buckled_mobs())
for(var/A in buckled_mobs)
var/mob/living/L = A
L.set_dir(dir)
/obj/structure/bed/chair/wheelchair/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/wrench) || istype(W,/obj/item/stack) || istype(W, /obj/item/weapon/wirecutters))
@@ -33,7 +35,7 @@
user.pulledby = null
user << "<span class='warning'>You lost your grip!</span>"
return
if(buckled_mob && pulling && user == buckled_mob)
if(has_buckled_mobs() && pulling && user in buckled_mobs)
if(pulling.stat || pulling.stunned || pulling.weakened || pulling.paralysis || pulling.lying || pulling.restrained())
pulling.pulledby = null
pulling = null
@@ -51,7 +53,7 @@
if(pulling && (get_dir(src.loc, pulling.loc) == direction))
user << "<span class='warning'>You cannot go there.</span>"
return
if(pulling && buckled_mob && (buckled_mob == user))
if(pulling && has_buckled_mobs() && (user in buckled_mobs))
user << "<span class='warning'>You cannot drive while being pushed.</span>"
return
@@ -59,10 +61,12 @@
driving = 1
var/turf/T = null
//--1---Move occupant---1--//
if(buckled_mob)
buckled_mob.buckled = null
step(buckled_mob, direction)
buckled_mob.buckled = src
if(has_buckled_mobs())
for(var/A in buckled_mobs)
var/mob/living/L = A
L.buckled = null
step(L, direction)
L.buckled = src
//--2----Move driver----2--//
if(pulling)
T = pulling.loc
@@ -70,8 +74,9 @@
step(pulling, get_dir(pulling.loc, src.loc))
//--3--Move wheelchair--3--//
step(src, direction)
if(buckled_mob) // Make sure it stays beneath the occupant
Move(buckled_mob.loc)
if(has_buckled_mobs()) // Make sure it stays beneath the occupant
var/mob/living/L = buckled_mobs[1]
Move(L.loc)
set_dir(direction)
if(pulling) // Driver
if(pulling.loc == src.loc) // We moved onto the wheelchair? Revert!
@@ -88,38 +93,41 @@
/obj/structure/bed/chair/wheelchair/Move()
..()
if(buckled_mob)
var/mob/living/occupant = buckled_mob
if(!driving)
occupant.buckled = null
occupant.Move(src.loc)
occupant.buckled = src
if (occupant && (src.loc != occupant.loc))
if (propelled)
for (var/mob/O in src.loc)
if (O != occupant)
Bump(O)
else
unbuckle_mob()
if (pulling && (get_dist(src, pulling) > 1))
pulling.pulledby = null
pulling << "<span class='warning'>You lost your grip!</span>"
pulling = null
else
if (occupant && (src.loc != occupant.loc))
src.forceMove(occupant.loc) // Failsafe to make sure the wheelchair stays beneath the occupant after driving
if(has_buckled_mobs())
for(var/A in buckled_mobs)
var/mob/living/occupant = A
if(!driving)
occupant.buckled = null
occupant.Move(src.loc)
occupant.buckled = src
if (occupant && (src.loc != occupant.loc))
if (propelled)
for (var/mob/O in src.loc)
if (O != occupant)
Bump(O)
else
unbuckle_mob()
if (pulling && (get_dist(src, pulling) > 1))
pulling.pulledby = null
pulling << "<span class='warning'>You lost your grip!</span>"
pulling = null
else
if (occupant && (src.loc != occupant.loc))
src.forceMove(occupant.loc) // Failsafe to make sure the wheelchair stays beneath the occupant after driving
/obj/structure/bed/chair/wheelchair/attack_hand(mob/living/user as mob)
if (pulling)
MouseDrop(usr)
else
user_unbuckle_mob(user)
if(has_buckled_mobs())
for(var/A in buckled_mobs)
user_unbuckle_mob(A, user)
return
/obj/structure/bed/chair/wheelchair/CtrlClick(var/mob/user)
if(in_range(src, user))
if(!ishuman(user)) return
if(user == buckled_mob)
if(has_buckled_mobs() && user in buckled_mobs)
user << "<span class='warning'>You realize you are unable to push the wheelchair you sit in.</span>"
return
if(!pulling)
@@ -137,7 +145,7 @@
/obj/structure/bed/chair/wheelchair/Bump(atom/A)
..()
if(!buckled_mob) return
if(!has_buckled_mobs()) return
if(propelled || (pulling && (pulling.a_intent == I_HURT)))
var/mob/living/occupant = unbuckle_mob()
@@ -213,7 +221,7 @@
..()
if((over_object == usr && (in_range(src, usr) || usr.contents.Find(src))))
if(!ishuman(usr)) return
if(buckled_mob) return 0
if(has_buckled_mobs()) return 0
visible_message("[usr] collapses \the [src.name].")
var/obj/item/wheelchair/R = new/obj/item/wheelchair(get_turf(src))
R.name = src.name