Merge branch 'master' of https://github.com/tgstation/-tg-station into turfs

Conflicts:
	code/game/objects/explosion.dm
	code/game/objects/items/stacks/sheets/mineral.dm
	code/game/objects/structures/girders.dm
	code/game/objects/structures/grille.dm
	code/game/turfs/turf.dm
	code/modules/events/spacevine.dm
	code/modules/events/wormholes.dm
	code/modules/mining/mine_items.dm
	code/modules/mob/living/silicon/robot/robot.dm
This commit is contained in:
duncathan
2016-04-03 18:22:20 -06:00
135 changed files with 1688 additions and 673 deletions
+2
View File
@@ -47,6 +47,8 @@
#define slot_legcuffed 19
#define slot_drone_storage 20
#define slots_amt 20 // Keep this up to date!
//Cant seem to find a mob bitflags area other than the powers one
// bitflags for clothing parts - also used for limbs
+1
View File
@@ -315,6 +315,7 @@ var/list/bloody_footprints_cache = list()
#define SENTIENCE_ORGANIC 1
#define SENTIENCE_ARTIFICIAL 2
#define SENTIENCE_OTHER 3
#define SENTIENCE_MINEBOT 4
//Fire stuff, for burn_state
#define LAVA_PROOF -2
+1
View File
@@ -21,3 +21,4 @@
#define BORGMESON 1
#define BORGTHERM 2
#define BORGXRAY 4
#define BORGMATERIAL 8
+8 -2
View File
@@ -332,13 +332,19 @@
for(var/client/C in show_to)
C.images -= I
/proc/get_active_player_count()
/proc/get_active_player_count(var/alive_check = 0, var/afk_check = 0, var/human_check = 0)
// Get active players who are playing in the round
var/active_players = 0
for(var/i = 1; i <= player_list.len; i++)
var/mob/M = player_list[i]
if(M && M.client)
if(istype(M, /mob/new_player)) // exclude people in the lobby
if(alive_check && M.stat)
continue
else if(afk_check && M.client.is_afk())
continue
else if(human_check && !istype(M, /mob/living/carbon/human))
continue
else if(istype(M, /mob/new_player)) // exclude people in the lobby
continue
else if(isobserver(M)) // Ghosts are fine if they were playing once (didn't start as observers)
var/mob/dead/observer/O = M
+2 -2
View File
@@ -901,8 +901,8 @@ var/list/WALLITEMS_INVERSE = list(
for(var/id in cached_gases)
var/gas_concentration = cached_gases[id][MOLES]/total_moles
if(id in hardcoded_gases || gas_concentration > 0.01) //ensures the four primary gases are always shown.
user << "<span class='notice'>[cached_gases[id][GAS_META][META_GAS_NAME]]: [round(gas_concentration*100)] %</span>"
if(id in hardcoded_gases || gas_concentration > 0.001) //ensures the four primary gases are always shown.
user << "<span class='notice'>[cached_gases[id][GAS_META][META_GAS_NAME]]: [round(gas_concentration*100, 0.01)] %</span>"
user << "<span class='notice'>Temperature: [round(air_contents.temperature-T0C)] &deg;C</span>"
else
+2 -1
View File
@@ -11,9 +11,10 @@ var/list/lizard_names_male = file2list("config/names/lizard_male.txt")
var/list/lizard_names_female = file2list("config/names/lizard_female.txt")
var/list/clown_names = file2list("config/names/clown.txt")
var/list/mime_names = file2list("config/names/mime.txt")
var/list/golem_names = file2list("config/names/golem.txt")
var/list/verbs = file2list("config/names/verbs.txt")
var/list/adjectives = file2list("config/names/adjectives.txt")
//loaded on startup because of "
//would include in rsc if ' was used
//would include in rsc if ' was used
+14 -24
View File
@@ -37,50 +37,34 @@
//equippable shit
//hands
inv_box = new /obj/screen/inventory()
inv_box.name = "r_hand"
inv_box = new /obj/screen/inventory/hand()
inv_box.name = "right hand"
inv_box.icon = 'icons/mob/screen_alien.dmi'
inv_box.icon_state = "hand_r_inactive"
if(mymob && !mymob.hand) //This being 0 or null means the right hand is in use
inv_box.icon_state = "hand_r_active"
inv_box.icon_state = "hand_r"
inv_box.screen_loc = ui_rhand
inv_box.layer = 19
inv_box.slot_id = slot_r_hand
r_hand_hud_object = inv_box
if(owner.handcuffed)
inv_box.overlays += image("icon"='icons/mob/screen_gen.dmi', "icon_state"="markus")
static_inventory += inv_box
inv_box = new /obj/screen/inventory()
inv_box.name = "l_hand"
inv_box = new /obj/screen/inventory/hand()
inv_box.name = "left hand"
inv_box.icon = 'icons/mob/screen_alien.dmi'
inv_box.icon_state = "hand_l_inactive"
if(mymob && mymob.hand) //This being 1 means the left hand is in use
inv_box.icon_state = "hand_l_active"
inv_box.icon_state = "hand_l"
inv_box.screen_loc = ui_lhand
inv_box.layer = 19
inv_box.slot_id = slot_l_hand
l_hand_hud_object = inv_box
if(owner.handcuffed)
inv_box.overlays += image("icon"='icons/mob/screen_gen.dmi', "icon_state"="gabrielle")
static_inventory += inv_box
//begin buttons
using = new /obj/screen/inventory()
using.name = "hand"
using = new /obj/screen/swap_hand()
using.icon = 'icons/mob/screen_alien.dmi'
using.icon_state = "swap_1"
using.screen_loc = ui_swaphand1
using.layer = 19
static_inventory += using
using = new /obj/screen/inventory()
using.name = "hand"
using = new /obj/screen/swap_hand()
using.icon = 'icons/mob/screen_alien.dmi'
using.icon_state = "swap_2"
using.screen_loc = ui_swaphand2
using.layer = 19
static_inventory += using
using = new /obj/screen/act_intent/alien()
@@ -130,6 +114,12 @@
zone_select.update_icon(mymob)
static_inventory += zone_select
for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory))
if(inv.slot_id)
inv.hud = src
inv_slots[inv.slot_id] = inv
inv.update_icon()
/datum/hud/alien/persistant_inventory_update()
if(!mymob)
return
+16 -22
View File
@@ -14,68 +14,62 @@
pull_icon.screen_loc = ui_drone_pull
static_inventory += pull_icon
inv_box = new /obj/screen/inventory()
inv_box.name = "r_hand"
inv_box = new /obj/screen/inventory/hand()
inv_box.name = "right hand"
inv_box.icon = ui_style
inv_box.icon_state = "hand_r_inactive"
if(mymob && !mymob.hand) //Hand being true means the LEFT hand is active
inv_box.icon_state = "hand_r_active"
inv_box.icon_state = "hand_r"
inv_box.screen_loc = ui_rhand
inv_box.slot_id = slot_r_hand
inv_box.layer = 19
r_hand_hud_object = inv_box
static_inventory += inv_box
inv_box = new /obj/screen/inventory()
inv_box.name = "l_hand"
inv_box = new /obj/screen/inventory/hand()
inv_box.name = "left hand"
inv_box.icon = ui_style
inv_box.icon_state = "hand_l_inactive"
if(mymob && mymob.hand) //Hand being true means the LEFT hand is active
inv_box.icon_state = "hand_l_active"
inv_box.icon_state = "hand_l"
inv_box.screen_loc = ui_lhand
inv_box.slot_id = slot_l_hand
inv_box.layer = 19
l_hand_hud_object = inv_box
static_inventory += inv_box
inv_box = new /obj/screen/inventory()
inv_box.name = "internal storage"
inv_box.icon = ui_style
inv_box.icon_state = "suit_storage"
// inv_box.icon_full = "template"
inv_box.screen_loc = ui_drone_storage
inv_box.slot_id = slot_drone_storage
inv_box.layer = 19
static_inventory += inv_box
inv_box = new /obj/screen/inventory()
inv_box.name = "head/mask"
inv_box.icon = ui_style
inv_box.icon_state = "mask"
// inv_box.icon_full = "template"
inv_box.screen_loc = ui_drone_head
inv_box.slot_id = slot_head
inv_box.layer = 19
static_inventory += inv_box
using = new /obj/screen/inventory()
using.name = "hand"
using = new /obj/screen/swap_hand()
using.icon = ui_style
using.icon_state = "swap_1_m"
using.screen_loc = ui_swaphand1
using.layer = 19
static_inventory += using
using = new /obj/screen/inventory()
using.name = "hand"
using = new /obj/screen/swap_hand()
using.icon = ui_style
using.icon_state = "swap_2"
using.screen_loc = ui_swaphand2
using.layer = 19
static_inventory += using
zone_select = new /obj/screen/zone_sel()
zone_select.icon = ui_style
zone_select.update_icon(mymob)
for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory))
if(inv.slot_id)
inv.hud = src
inv_slots[inv.slot_id] = inv
inv.update_icon()
/datum/hud/drone/persistant_inventory_update()
if(!mymob)
+6 -8
View File
@@ -24,8 +24,6 @@
var/obj/screen/deity_follower_display
var/obj/screen/nightvisionicon
var/obj/screen/r_hand_hud_object
var/obj/screen/l_hand_hud_object
var/obj/screen/action_intent
var/obj/screen/zone_select
var/obj/screen/pull_icon
@@ -37,6 +35,7 @@
var/list/obj/screen/hotkeybuttons = list() //the buttons that can be used via hotkeys
var/list/infodisplay = list() //the screen objects that display mob info (health, alien plasma, etc...)
var/list/screenoverlays = list() //the screen objects used as whole screen overlays (flash, damageoverlay, etc...)
var/list/inv_slots[slots_amt] // /obj/screen/inventory objects, ordered by their slot ID.
var/obj/screen/movable/action_button/hide_toggle/hide_actions_toggle
var/action_buttons_hidden = 0
@@ -65,8 +64,7 @@
qdel(thing)
static_inventory.Cut()
r_hand_hud_object = null
l_hand_hud_object = null
inv_slots.Cut()
action_intent = null
zone_select = null
pull_icon = null
@@ -154,10 +152,10 @@
mymob.client.screen += infodisplay
//These ones are a part of 'static_inventory', 'toggleable_inventory' or 'hotkeybuttons' but we want them to stay
if(l_hand_hud_object)
mymob.client.screen += l_hand_hud_object //we want the hands to be visible
if(r_hand_hud_object)
mymob.client.screen += r_hand_hud_object //we want the hands to be visible
if(inv_slots[slot_l_hand])
mymob.client.screen += inv_slots[slot_l_hand] //we want the hands to be visible
if(inv_slots[slot_r_hand])
mymob.client.screen += inv_slots[slot_r_hand] //we want the hands to be visible
if(action_intent)
mymob.client.screen += action_intent //we want the intent switcher visible
action_intent.screen_loc = ui_acti_alt //move this to the alternative position, where zone_select usually is.
+28 -38
View File
@@ -76,8 +76,8 @@
inv_box.icon = ui_style
inv_box.slot_id = slot_w_uniform
inv_box.icon_state = "uniform"
// inv_box.icon_full = "template"
inv_box.screen_loc = ui_iclothing
inv_box.layer = 19
toggleable_inventory += inv_box
inv_box = new /obj/screen/inventory()
@@ -85,106 +85,90 @@
inv_box.icon = ui_style
inv_box.slot_id = slot_wear_suit
inv_box.icon_state = "suit"
// inv_box.icon_full = "template"
inv_box.screen_loc = ui_oclothing
inv_box.layer = 19
toggleable_inventory += inv_box
inv_box = new /obj/screen/inventory()
inv_box.name = "r_hand"
inv_box = new /obj/screen/inventory/hand()
inv_box.name = "right hand"
inv_box.icon = ui_style
inv_box.icon_state = "hand_r_inactive"
if(mymob && !mymob.hand) //This being 0 or null means the right hand is in use
inv_box.icon_state = "hand_r_active"
inv_box.icon_state = "hand_r"
inv_box.screen_loc = ui_rhand
inv_box.slot_id = slot_r_hand
inv_box.layer = 19
r_hand_hud_object = inv_box
if(owner.handcuffed)
inv_box.overlays += image("icon"='icons/mob/screen_gen.dmi', "icon_state"="markus")
static_inventory += inv_box
inv_box = new /obj/screen/inventory()
inv_box.name = "l_hand"
inv_box = new /obj/screen/inventory/hand()
inv_box.name = "left hand"
inv_box.icon = ui_style
inv_box.icon_state = "hand_l_inactive"
if(mymob && mymob.hand) //This being 1 means the left hand is in use
inv_box.icon_state = "hand_l_active"
inv_box.icon_state = "hand_l"
inv_box.screen_loc = ui_lhand
inv_box.slot_id = slot_l_hand
inv_box.layer = 19
l_hand_hud_object = inv_box
if(owner.handcuffed)
inv_box.overlays += image("icon"='icons/mob/screen_gen.dmi', "icon_state"="gabrielle")
static_inventory += inv_box
using = new /obj/screen/inventory()
using.name = "hand"
using = new /obj/screen/swap_hand()
using.icon = ui_style
using.icon_state = "swap_1"
using.screen_loc = ui_swaphand1
using.layer = 19
static_inventory += using
using = new /obj/screen/inventory()
using.name = "hand"
using = new /obj/screen/swap_hand()
using.icon = ui_style
using.icon_state = "swap_2"
using.screen_loc = ui_swaphand2
using.layer = 19
static_inventory += using
inv_box = new /obj/screen/inventory()
inv_box.name = "id"
inv_box.icon = ui_style
inv_box.icon_state = "id"
// inv_box.icon_full = "template_small"
inv_box.screen_loc = ui_id
inv_box.slot_id = slot_wear_id
inv_box.layer = 19
static_inventory += inv_box
inv_box = new /obj/screen/inventory()
inv_box.name = "mask"
inv_box.icon = ui_style
inv_box.icon_state = "mask"
// inv_box.icon_full = "template"
inv_box.screen_loc = ui_mask
inv_box.slot_id = slot_wear_mask
inv_box.layer = 19
toggleable_inventory += inv_box
inv_box = new /obj/screen/inventory()
inv_box.name = "back"
inv_box.icon = ui_style
inv_box.icon_state = "back"
// inv_box.icon_full = "template_small"
inv_box.screen_loc = ui_back
inv_box.slot_id = slot_back
inv_box.layer = 19
static_inventory += inv_box
inv_box = new /obj/screen/inventory()
inv_box.name = "storage1"
inv_box.icon = ui_style
inv_box.icon_state = "pocket"
// inv_box.icon_full = "template_small"
inv_box.screen_loc = ui_storage1
inv_box.slot_id = slot_l_store
inv_box.layer = 19
static_inventory += inv_box
inv_box = new /obj/screen/inventory()
inv_box.name = "storage2"
inv_box.icon = ui_style
inv_box.icon_state = "pocket"
// inv_box.icon_full = "template_small"
inv_box.screen_loc = ui_storage2
inv_box.slot_id = slot_r_store
inv_box.layer = 19
static_inventory += inv_box
inv_box = new /obj/screen/inventory()
inv_box.name = "suit storage"
inv_box.icon = ui_style
inv_box.icon_state = "suit_storage"
// inv_box.icon_full = "template"
inv_box.screen_loc = ui_sstore1
inv_box.slot_id = slot_s_store
inv_box.layer = 19
static_inventory += inv_box
using = new /obj/screen/resist()
@@ -206,54 +190,54 @@
inv_box.name = "gloves"
inv_box.icon = ui_style
inv_box.icon_state = "gloves"
// inv_box.icon_full = "template"
inv_box.screen_loc = ui_gloves
inv_box.slot_id = slot_gloves
inv_box.layer = 19
toggleable_inventory += inv_box
inv_box = new /obj/screen/inventory()
inv_box.name = "eyes"
inv_box.icon = ui_style
inv_box.icon_state = "glasses"
// inv_box.icon_full = "template"
inv_box.screen_loc = ui_glasses
inv_box.slot_id = slot_glasses
inv_box.layer = 19
toggleable_inventory += inv_box
inv_box = new /obj/screen/inventory()
inv_box.name = "ears"
inv_box.icon = ui_style
inv_box.icon_state = "ears"
// inv_box.icon_full = "template"
inv_box.screen_loc = ui_ears
inv_box.slot_id = slot_ears
inv_box.layer = 19
toggleable_inventory += inv_box
inv_box = new /obj/screen/inventory()
inv_box.name = "head"
inv_box.icon = ui_style
inv_box.icon_state = "head"
// inv_box.icon_full = "template"
inv_box.screen_loc = ui_head
inv_box.slot_id = slot_head
inv_box.layer = 19
toggleable_inventory += inv_box
inv_box = new /obj/screen/inventory()
inv_box.name = "shoes"
inv_box.icon = ui_style
inv_box.icon_state = "shoes"
// inv_box.icon_full = "template"
inv_box.screen_loc = ui_shoes
inv_box.slot_id = slot_shoes
inv_box.layer = 19
toggleable_inventory += inv_box
inv_box = new /obj/screen/inventory()
inv_box.name = "belt"
inv_box.icon = ui_style
inv_box.icon_state = "belt"
// inv_box.icon_full = "template_small"
inv_box.screen_loc = ui_belt
inv_box.slot_id = slot_belt
inv_box.layer = 19
static_inventory += inv_box
throw_icon = new /obj/screen/throw_catch()
@@ -290,6 +274,12 @@
inventory_shown = 0
for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory))
if(inv.slot_id)
inv.hud = src
inv_slots[inv.slot_id] = inv
inv.update_icon()
/datum/hud/human/hidden_inventory_update()
if(!mymob)
return
+17 -27
View File
@@ -21,75 +21,59 @@
using.screen_loc = ui_drop_throw
static_inventory += using
inv_box = new /obj/screen/inventory()
inv_box.name = "r_hand"
inv_box = new /obj/screen/inventory/hand()
inv_box.name = "right hand"
inv_box.icon = ui_style
inv_box.icon_state = "hand_r_inactive"
if(mymob && !mymob.hand) //This being 0 or null means the right hand is in use
inv_box.icon_state = "hand_r_active"
inv_box.icon_state = "hand_r"
inv_box.screen_loc = ui_rhand
inv_box.slot_id = slot_r_hand
inv_box.layer = 19
r_hand_hud_object = inv_box
if(owner.handcuffed)
inv_box.overlays += image("icon"='icons/mob/screen_gen.dmi', "icon_state"="markus")
static_inventory += inv_box
inv_box = new /obj/screen/inventory()
inv_box.name = "l_hand"
inv_box = new /obj/screen/inventory/hand()
inv_box.name = "left hand"
inv_box.icon = ui_style
inv_box.icon_state = "hand_l_inactive"
if(mymob && mymob.hand) //This being 1 means the left hand is in use
inv_box.icon_state = "hand_l_active"
inv_box.icon_state = "hand_l"
inv_box.screen_loc = ui_lhand
inv_box.slot_id = slot_l_hand
inv_box.layer = 19
l_hand_hud_object = inv_box
if(owner.handcuffed)
inv_box.overlays += image("icon"='icons/mob/screen_gen.dmi', "icon_state"="gabrielle")
static_inventory += inv_box
using = new /obj/screen/inventory()
using.name = "hand"
using = new /obj/screen/swap_hand()
using.icon = ui_style
using.icon_state = "swap_1_m" //extra wide!
using.screen_loc = ui_swaphand1
using.layer = 19
static_inventory += using
using = new /obj/screen/inventory()
using.name = "hand"
using = new /obj/screen/swap_hand()
using.icon = ui_style
using.icon_state = "swap_2"
using.screen_loc = ui_swaphand2
using.layer = 19
static_inventory += using
inv_box = new /obj/screen/inventory()
inv_box.name = "mask"
inv_box.icon = ui_style
inv_box.icon_state = "mask"
// inv_box.icon_full = "template"
inv_box.screen_loc = ui_monkey_mask
inv_box.slot_id = slot_wear_mask
inv_box.layer = 19
static_inventory += inv_box
inv_box = new /obj/screen/inventory()
inv_box.name = "head"
inv_box.icon = ui_style
inv_box.icon_state = "head"
// inv_box.icon_full = "template"
inv_box.screen_loc = ui_monkey_head
inv_box.slot_id = slot_head
inv_box.layer = 19
static_inventory += inv_box
inv_box = new /obj/screen/inventory()
inv_box.name = "back"
inv_box.icon = ui_style
inv_box.icon_state = "back"
inv_box.icon_full = "template_small"
inv_box.screen_loc = ui_back
inv_box.slot_id = slot_back
inv_box.layer = 19
static_inventory += inv_box
throw_icon = new /obj/screen/throw_catch()
@@ -128,6 +112,12 @@
using.screen_loc = ui_pull_resist
hotkeybuttons += using
for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory))
if(inv.slot_id)
inv.hud = src
inv_slots[inv.slot_id] = inv
inv.update_icon()
/datum/hud/monkey/persistant_inventory_update()
if(!mymob)
return
+94 -37
View File
@@ -13,6 +13,7 @@
unacidable = 1
appearance_flags = APPEARANCE_UI
var/obj/master = null //A reference to the object in the slot. Grabs or items, generally.
var/datum/hud/hud = null // A reference to the owner HUD, if any.
/obj/screen/Destroy()
master = null
@@ -27,19 +28,107 @@
maptext_height = 480
maptext_width = 480
/obj/screen/swap_hand
layer = 19
name = "swap hand"
/obj/screen/swap_hand/Click()
// At this point in client Click() code we have passed the 1/10 sec check and little else
// We don't even know if it's a middle click
if(world.time <= usr.next_move)
return 1
if(usr.incapacitated())
return 1
if(ismob(usr))
var/mob/M = usr
M.swap_hand()
return 1
/obj/screen/inventory
var/slot_id //The indentifier for the slot. It has nothing to do with ID cards.
var/slot_id // The indentifier for the slot. It has nothing to do with ID cards.
var/icon_empty // Icon when empty. For now used only by humans.
var/icon_full // Icon when contains an item. For now used only by humans.
layer = 19
/obj/screen/inventory/Click()
// At this point in client Click() code we have passed the 1/10 sec check and little else
// We don't even know if it's a middle click
if(world.time <= usr.next_move)
return 1
if(usr.incapacitated())
return 1
if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech
return 1
if(usr.attack_ui(slot_id))
usr.update_inv_l_hand(0)
usr.update_inv_r_hand(0)
return 1
/obj/screen/inventory/update_icon()
if(!icon_empty)
icon_empty = icon_state
if(hud && hud.mymob && slot_id && icon_full)
if(hud.mymob.get_item_by_slot(slot_id))
icon_state = icon_full
else
icon_state = icon_empty
/obj/screen/inventory/hand
var/image/active_overlay
var/image/handcuff_overlay
/obj/screen/inventory/hand/update_icon()
..()
if(!active_overlay)
active_overlay = image("icon"=icon, "icon_state"="hand_active")
if(!handcuff_overlay)
var/state = (slot_id == slot_r_hand) ? "markus" : "gabrielle"
handcuff_overlay = image("icon"='icons/mob/screen_gen.dmi', "icon_state"=state)
overlays.Cut()
if(hud && hud.mymob)
if(iscarbon(hud.mymob))
var/mob/living/carbon/C = hud.mymob
if(C.handcuffed)
overlays += handcuff_overlay
if(slot_id == slot_l_hand && hud.mymob.hand)
overlays += active_overlay
else if(slot_id == slot_r_hand && !hud.mymob.hand)
overlays += active_overlay
/obj/screen/inventory/hand/Click()
// At this point in client Click() code we have passed the 1/10 sec check and little else
// We don't even know if it's a middle click
if(world.time <= usr.next_move)
return 1
if(usr.incapacitated())
return 1
if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech
return 1
if(ismob(usr))
var/mob/M = usr
switch(name)
if("right hand", "r_hand")
M.activate_hand("r")
if("left hand", "l_hand")
M.activate_hand("l")
return 1
/obj/screen/close
name = "close"
/obj/screen/close/Click()
if(master)
if(istype(master, /obj/item/weapon/storage))
var/obj/item/weapon/storage/S = master
S.close(usr)
if(istype(master, /obj/item/weapon/storage))
var/obj/item/weapon/storage/S = master
S.close(usr)
return 1
@@ -304,38 +393,6 @@
/obj/screen/zone_sel/robot
icon = 'icons/mob/screen_cyborg.dmi'
/obj/screen/inventory/Click()
// At this point in client Click() code we have passed the 1/10 sec check and little else
// We don't even know if it's a middle click
if(world.time <= usr.next_move)
return 1
if(usr.incapacitated())
return 1
if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech
return 1
switch(name)
if("r_hand")
if(ismob(usr))
var/mob/Mr = usr
Mr.activate_hand("r")
if("l_hand")
if(ismob(usr))
var/mob/Ml = usr
Ml.activate_hand("l")
if("swap")
if(ismob(usr))
var/mob/Ms = usr
Ms.swap_hand()
if("hand")
if(ismob(usr))
var/mob/Mh = usr
Mh.swap_hand()
else
if(usr.attack_ui(slot_id))
usr.update_inv_l_hand(0)
usr.update_inv_r_hand(0)
return 1
/obj/screen/flash
name = "flash"
+13 -1
View File
@@ -90,7 +90,6 @@
var/list/probabilities = list() // relative probability of each mode
var/humans_need_surnames = 0
var/allow_random_events = 0 // enables random events mid-round when set to 1
var/allow_ai = 0 // allow ai job
var/forbid_secborg = 0 // disallow secborg module to be chosen.
var/panic_bunker = 0 // prevents new people it hasn't seen before from connecting
@@ -187,6 +186,13 @@
var/maprotation = 1
var/maprotatechancedelta = 0.75
// Enables random events mid-round when set to 1
var/allow_random_events = 0
// Multipliers for random events minimal starting time and minimal players amounts
var/events_min_time_mul = 1
var/events_min_players_mul = 1
// The object used for the clickable stat() button.
var/obj/effect/statclick/statclick
@@ -510,6 +516,12 @@
config.allow_latejoin_antagonists = 1
if("allow_random_events")
config.allow_random_events = 1
if("events_min_time_mul")
config.events_min_time_mul = text2num(value)
if("events_min_players_mul")
config.events_min_players_mul = text2num(value)
if("minimal_access_threshold")
config.minimal_access_threshold = text2num(value)
if("jobs_have_minimal_access")
+1 -1
View File
@@ -148,7 +148,7 @@ var/global/datum/controller/master/Master = new()
//this is a queue for any SS skipped or paused for tick reasons, to be ran first next tick
if (priority_queue.len)
priorityrunning = priority_queue.len
subsystemstorun = priority_queue | subsystems
subsystemstorun = priority_queue | subsystemstorun
#endif
var/ran_subsystems = 0
while(subsystemstorun.len)
+3 -5
View File
@@ -26,7 +26,7 @@ var/datum/subsystem/air/SSair
//Special functions lists
var/list/turf/active_super_conductivity = list()
var/list/turf/high_pressure_delta = list()
var/list/turf/open/high_pressure_delta = list()
/datum/subsystem/air/New()
@@ -179,7 +179,8 @@ var/datum/subsystem/air/SSair
z_start = z_level
z_finish = z_level
var/list/turfs_to_init = block(locate(1, 1, z_start), locate(world.maxx, world.maxy, z_finish))
var/turf/open/space/S = /turf/open/space
var/list/turfs_to_init = block(locate(1, 1, z_start), locate(world.maxx, world.maxy, z_finish)) - S.space_turfs
for(var/thing in turfs_to_init)
var/turf/t = thing
@@ -189,9 +190,6 @@ var/datum/subsystem/air/SSair
if(t.blocks_air)
continue
if(istype(t, /turf/open/space))
continue //don't need to initialize these; just slows down roundstart without any real benefit
var/turf/open/T = t
T.excited = 0
+6 -20
View File
@@ -70,19 +70,14 @@ var/datum/subsystem/events/SSevent
// if(E) E.runEvent()
return
var/gamemode = ticker.mode.config_tag
var/players_amt = get_active_player_count(alive_check = 1, afk_check = 1, human_check = 1)
// Only alive, non-AFK human players count towards this.
var/sum_of_weights = 0
for(var/datum/round_event_control/E in control)
if(E.occurrences >= E.max_occurrences)
if(!E.canSpawnEvent(players_amt, gamemode))
continue
if(E.earliest_start >= world.time)
continue
if(E.gamemode_blacklist.len && (ticker.mode.config_tag in E.gamemode_blacklist))
continue
if(E.gamemode_whitelist.len && !(ticker.mode.config_tag in E.gamemode_whitelist))
continue
if(E.holidayID)
if(!holidays || !holidays[E.holidayID])
continue
if(E.weight < 0) //for round-start events etc.
if(E.runEvent() == PROCESS_KILL)
E.max_occurrences = 0
@@ -96,17 +91,8 @@ var/datum/subsystem/events/SSevent
sum_of_weights = rand(0,sum_of_weights) //reusing this variable. It now represents the 'weight' we want to select
for(var/datum/round_event_control/E in control)
if(E.occurrences >= E.max_occurrences)
if(!E.canSpawnEvent(players_amt, gamemode))
continue
if(E.earliest_start >= world.time)
continue
if(E.gamemode_blacklist.len && (ticker.mode.config_tag in E.gamemode_blacklist))
continue
if(E.gamemode_whitelist.len && !(ticker.mode.config_tag in E.gamemode_whitelist))
continue
if(E.holidayID)
if(!holidays || !holidays[E.holidayID])
continue
sum_of_weights -= E.weight
if(sum_of_weights <= 0) //we've hit our goal
+6 -1
View File
@@ -5,7 +5,12 @@ var/datum/subsystem/lighting/SSlighting
/datum/subsystem/lighting
name = "Lighting"
priority = 1
wait = 6
wait = 1
dynamic_wait = 1
dwait_delta = 4
dwait_buffer = 0.1
dwait_lower = 1
dwait_upper = 5
display = 5
var/list/changed_lights = list() //list of all datum/light_source that need updating
+2 -2
View File
@@ -62,7 +62,7 @@
src.key = key
/datum/mind/proc/transfer_to(mob/new_character)
/datum/mind/proc/transfer_to(mob/new_character, var/force_key_move = 0)
if(current) // remove ourself from our old body's mind variable
current.mind = null
SStgui.on_transfer(current, new_character)
@@ -83,7 +83,7 @@
transfer_antag_huds(hud_to_transfer) //inherit the antag HUD
transfer_actions(new_character)
if(active)
if(active || force_key_move)
new_character.key = key //now transfer the key to link the client to our new body
/datum/mind/proc/store_memory(new_text)
@@ -112,6 +112,7 @@
src << "<span class='revenboldnotice'>You can move again!</span>"
if(essence_regenerating && !inhibited && essence < essence_regen_cap) //While inhibited, essence will not regenerate
essence = min(essence_regen_cap, essence+essence_regen_amount)
update_action_buttons_icon() //because we update something required by our spells in life, we need to update our buttons
update_spooky_icon()
update_health_hud()
..()
@@ -283,6 +284,7 @@
if(essence + essence_amt <= 0)
return
essence = max(0, essence+essence_amt)
update_action_buttons_icon()
update_health_hud()
if(essence_amt > 0)
essence_accumulated = max(0, essence_accumulated+essence_amt)
+19 -4
View File
@@ -80,7 +80,9 @@
/obj/structure/barricade/CanPass(atom/movable/mover, turf/target, height=0)//So bullets will fly over and stuff.
if(height==0)
return 1
if(istype(mover, /obj/item/projectile))
if(locate(/obj/structure/barricade) in get_turf(mover))
return 1
else if(istype(mover, /obj/item/projectile))
if(!anchored)
return 1
var/obj/item/projectile/proj = mover
@@ -90,9 +92,7 @@
return 1
return 0
else
return 0
return !density
@@ -106,6 +106,21 @@
material = WOOD
/obj/structure/barricade/sandbags
name = "sandbags"
desc = "Bags of sand. Self explanatory."
icon = 'icons/obj/smooth_structures/sandbags.dmi'
icon_state = "sandbags"
health = 280
maxhealth = 280
proj_pass_rate = 20
pass_flags = LETPASSTHROW
material = null
climbable = TRUE
smooth = SMOOTH_TRUE
canSmoothWith = list(/obj/structure/barricade/sandbags, /turf/simulated/wall, /turf/simulated/wall/r_wall, /obj/structure/falsewall, /obj/structure/falsewall/reinforced, /turf/simulated/wall/rust, /turf/simulated/wall/r_wall/rust, /obj/structure/barricade/security)
/obj/structure/barricade/security
name = "security barrier"
desc = "A deployable barrier. Provides good cover in fire fights."
+4
View File
@@ -60,6 +60,10 @@
storage_type = /obj/item/weapon/watertank/atmos
/obj/machinery/suit_storage_unit/mining
suit_type = /obj/item/clothing/suit/hooded/explorer
mask_type = /obj/item/clothing/mask/gas
/obj/machinery/suit_storage_unit/mining/eva
suit_type = /obj/item/clothing/suit/space/hardsuit/mining
mask_type = /obj/item/clothing/mask/breath
+1 -1
View File
@@ -789,7 +789,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
icon_state = "nutri"
icon_deny = "nutri-deny"
products = list(/obj/item/weapon/reagent_containers/glass/bottle/nutrient/ez = 30,/obj/item/weapon/reagent_containers/glass/bottle/nutrient/l4z = 20,/obj/item/weapon/reagent_containers/glass/bottle/nutrient/rh = 10,/obj/item/weapon/reagent_containers/spray/pestspray = 20,
/obj/item/weapon/reagent_containers/syringe = 5,/obj/item/weapon/storage/bag/plants = 5,/obj/item/weapon/cultivator = 3,/obj/item/weapon/shovel/spade = 3,/obj/item/device/analyzer/plant_analyzer = 2)
/obj/item/weapon/reagent_containers/syringe = 5,/obj/item/weapon/storage/bag/plants = 5,/obj/item/weapon/cultivator = 3,/obj/item/weapon/shovel/spade = 3,/obj/item/device/analyzer/plant_analyzer = 4)
contraband = list(/obj/item/weapon/reagent_containers/glass/bottle/ammonia = 10,/obj/item/weapon/reagent_containers/glass/bottle/diethylamine = 5)
/obj/machinery/vending/hydroseeds
+1 -1
View File
@@ -34,7 +34,7 @@
var/list/cached_exp_block = list()
if(adminlog)
message_admins("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in area [epicenter.loc.name] ([epicenter.x],[epicenter.y],[epicenter.z])")
message_admins("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in area [epicenter.loc.name] ([epicenter.x],[epicenter.y],[epicenter.z] - <a href='?_src_=holder;adminplayerobservecoodjump=1;X=[epicenter.x];Y=[epicenter.y];Z=[epicenter.z]'>JMP</a>)")
log_game("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in area [epicenter.loc.name] ([epicenter.x],[epicenter.y],[epicenter.z])")
// Play sounds; we want sounds to be different depending on distance so we will manually do it ourselves.
+2 -2
View File
@@ -268,8 +268,8 @@ var/global/list/obj/item/device/pda/PDAs = list()
if (total_moles)
for(var/id in env_gases)
var/gas_level = env_gases[id][MOLES]/total_moles
if(id in hardcoded_gases || gas_level > 0.01)
dat += "[env_gases[id][GAS_META][META_GAS_NAME]]: [round(gas_level*100)]%<br>"
if(id in hardcoded_gases || gas_level > 0.001)
dat += "[env_gases[id][GAS_META][META_GAS_NAME]]: [round(gas_level*100, 0.01)]%<br>"
dat += "Temperature: [round(environment.temperature-T0C)]&deg;C<br>"
dat += "<br>"
+11 -9
View File
@@ -281,28 +281,30 @@ MASS SPECTROMETER
environment.garbage_collect()
if(abs(n2_concentration - N2STANDARD) < 20)
user << "<span class='info'>Nitrogen: [round(n2_concentration*100)] %</span>"
user << "<span class='info'>Nitrogen: [round(n2_concentration*100, 0.01)] %</span>"
else
user << "<span class='alert'>Nitrogen: [round(n2_concentration*100)] %</span>"
user << "<span class='alert'>Nitrogen: [round(n2_concentration*100, 0.01)] %</span>"
if(abs(o2_concentration - O2STANDARD) < 2)
user << "<span class='info'>Oxygen: [round(o2_concentration*100)] %</span>"
user << "<span class='info'>Oxygen: [round(o2_concentration*100, 0.01)] %</span>"
else
user << "<span class='alert'>Oxygen: [round(o2_concentration*100)] %</span>"
user << "<span class='alert'>Oxygen: [round(o2_concentration*100, 0.01)] %</span>"
if(co2_concentration > 0.01)
user << "<span class='alert'>CO2: [round(co2_concentration*100)] %</span>"
user << "<span class='alert'>CO2: [round(co2_concentration*100, 0.01)] %</span>"
else
user << "<span class='info'>CO2: [round(co2_concentration*100)] %</span>"
user << "<span class='info'>CO2: [round(co2_concentration*100, 0.01)] %</span>"
if(plasma_concentration > 0.01)
user << "<span class='info'>Plasma: [round(plasma_concentration*100)] %</span>"
if(plasma_concentration > 0.005)
user << "<span class='alert'>Plasma: [round(plasma_concentration*100, 0.01)] %</span>"
else
user << "<span class='info'>Plasma: [round(plasma_concentration*100, 0.01)] %</span>"
for(var/id in env_gases)
if(id in hardcoded_gases)
continue
var/gas_concentration = env_gases[id][MOLES]/total_moles
user << "<span class='alert'>[env_gases[id][GAS_META][META_GAS_NAME]]: [round(gas_concentration*100)] %</span>"
user << "<span class='alert'>[env_gases[id][GAS_META][META_GAS_NAME]]: [round(gas_concentration*100, 0.01)] %</span>"
user << "<span class='info'>Temperature: [round(environment.temperature-T0C)] &deg;C</span>"
@@ -174,6 +174,10 @@
sight_mode = BORGMESON
icon_state = "meson"
/obj/item/borg/sight/material
name = "\proper material vision"
sight_mode = BORGMATERIAL
icon_state = "material"
/obj/item/borg/sight/hud
name = "hud"
@@ -2,6 +2,7 @@
Mineral Sheets
Contains:
- Sandstone
- Sandbags
- Diamond
- Snow
- Uranium
@@ -50,6 +51,32 @@ var/global/list/datum/stack_recipe/sandstone_recipes = list ( \
/obj/item/stack/sheet/mineral/sandstone/thirty
amount = 30
/*
* Sandbags(
*/
/obj/item/stack/sheet/mineral/sandbags
name = "sandbags"
icon = 'icons/obj/items.dmi'
icon_state = "sandbag"
singular_name = "sandbag"
force = 5
throwforce = 5
w_class = 3
throw_speed = 1
throw_range = 3
origin_tech = "materials=2"
var/global/list/datum/stack_recipe/sandbag_recipes = list ( \
new/datum/stack_recipe("sandbags", /obj/structure/barricade/sandbags, 1, time = 25, one_per_turf = 1, on_floor = 1), \
)
/obj/item/stack/sheet/mineral/sandbags/New(var/loc, var/amount=null)
recipes = sandbag_recipes
pixel_x = rand(0,4)-4
pixel_y = rand(0,4)-4
..()
/*
* Diamond
*/
@@ -57,6 +57,11 @@ var/global/list/datum/stack_recipe/metal_recipes = list ( \
flags = CONDUCT
origin_tech = "materials=1"
/obj/item/stack/sheet/metal/narsie_act()
if(prob(20))
new /obj/item/stack/sheet/runed_metal(loc, amount)
qdel(src)
/obj/item/stack/sheet/metal/fifty
amount = 50
+10 -10
View File
@@ -864,17 +864,17 @@
M.put_in_hands(src)
usr << "<span class='notice'>You pick up the deck.</span>"
else if(istype(over_object, /obj/screen))
switch(over_object.name)
if("l_hand")
if(!remove_item_from_storage(M))
M.unEquip(src)
M.put_in_l_hand(src)
else if("r_hand")
if(!remove_item_from_storage(M))
M.unEquip(src)
else if(istype(over_object, /obj/screen/inventory/hand))
var/obj/screen/inventory/hand/H = over_object
if(!remove_item_from_storage(M))
M.unEquip(src)
switch(H.slot_id)
if(slot_r_hand)
M.put_in_r_hand(src)
usr << "<span class='notice'>You pick up the deck.</span>"
if(slot_l_hand)
M.put_in_l_hand(src)
usr << "<span class='notice'>You pick up the deck.</span>"
else
usr << "<span class='warning'>You can't reach it from here!</span>"
-3
View File
@@ -125,9 +125,6 @@ var/global/list/RPD_recipes=list(
desc = "A device used to rapidly pipe things."
icon = 'icons/obj/items.dmi'
icon_state = "rpd"
opacity = 0
density = 0
anchored = 0
flags = CONDUCT
force = 10
throwforce = 10
+16 -13
View File
@@ -91,19 +91,22 @@
/obj/item/weapon/defibrillator/MouseDrop(obj/over_object)
if(ismob(src.loc))
var/mob/M = src.loc
switch(over_object.name)
if("r_hand")
if(M.r_hand)
return
if(!M.unEquip(src))
return
M.put_in_r_hand(src)
if("l_hand")
if(M.l_hand)
return
if(!M.unEquip(src))
return
M.put_in_l_hand(src)
if(istype(over_object, /obj/screen/inventory/hand))
var/obj/screen/inventory/hand/H = over_object
switch(H.slot_id)
if(slot_r_hand)
if(M.r_hand)
return
if(!M.unEquip(src))
return
M.put_in_r_hand(src)
if(slot_l_hand)
if(M.l_hand)
return
if(!M.unEquip(src))
return
M.put_in_l_hand(src)
/obj/item/weapon/defibrillator/attackby(obj/item/weapon/W, mob/user, params)
if(W == paddles)
@@ -72,6 +72,7 @@
desc = "Looks like some cables tied together. Could be used to tie something up."
icon_state = "cuff_red"
item_state = "coil_red"
materials = list(MAT_METAL=150, MAT_GLASS=75)
breakouttime = 300 //Deciseconds = 30s
cuffsound = 'sound/weapons/cablecuff.ogg'
var/datum/robot_energy_storage/wirestorage = null
@@ -179,6 +180,7 @@
name = "zipties"
desc = "Plastic, disposable zipties that can be used to restrain temporarily but are destroyed after use."
icon_state = "cuff_white"
materials = list()
breakouttime = 450 //Deciseconds = 45s
trashtype = /obj/item/weapon/restraints/handcuffs/cable/zipties/used
@@ -98,6 +98,12 @@
origin_tech = "materials=2;combat=4"
attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "cut")
/obj/item/weapon/kitchen/knife/combat/survival
name = "survival knife"
force = 15
throwforce = 15
/obj/item/weapon/kitchen/knife/combat/cyborg
name = "cyborg knife"
icon = 'icons/obj/items_cyborg.dmi'
@@ -17,4 +17,11 @@
icon = 'icons/obj/items.dmi'
icon_state = "skub"
w_class = 4
attack_verb = list("skubbed")
attack_verb = list("skubbed")
/obj/item/weapon/emptysandbag
name = "empty sandbag"
desc = "A bag to be filled with sand."
icon = 'icons/obj/items.dmi'
icon_state = "sandbag"
w_class = 1
@@ -664,3 +664,123 @@
#undef SYNDI
#undef HEART
#undef SMILE
/obj/item/weapon/storage/box/ingredients //This box is for the randomely chosen version the chef spawns with, it shouldn't actually exist.
name = "ingredients box"
icon_state = "donk_kit"
item_state = null
/obj/item/weapon/storage/box/ingredients/wildcard
item_state = "wildcard"
/obj/item/weapon/storage/box/ingredients/wildcard/New()
..()
for(var/i in 1 to 6)
//Pick common ingredients
var/randomFood = pick(/obj/item/weapon/reagent_containers/food/snacks/grown/chili,
/obj/item/weapon/reagent_containers/food/snacks/grown/tomato,
/obj/item/weapon/reagent_containers/food/snacks/grown/carrot,
/obj/item/weapon/reagent_containers/food/snacks/grown/potato,
/obj/item/weapon/reagent_containers/food/snacks/grown/apple,
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar,
/obj/item/weapon/reagent_containers/food/snacks/grown/cherries,
/obj/item/weapon/reagent_containers/food/snacks/grown/banana,
/obj/item/weapon/reagent_containers/food/snacks/grown/cabbage,
/obj/item/weapon/reagent_containers/food/snacks/grown/soybeans,
/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris,
/obj/item/weapon/reagent_containers/food/snacks/grown/corn)
new randomFood(src)
//Pick one random rare ingredient
var/randomRareFood = pick(/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/deus,
/obj/item/weapon/reagent_containers/food/snacks/grown/apple/gold,
/obj/item/weapon/reagent_containers/food/snacks/grown/icepepper,
/obj/item/weapon/reagent_containers/food/snacks/grown/ghost_chili,
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/plumphelmet,
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/chanterelle)
new randomRareFood(src)
/obj/item/weapon/storage/box/ingredients/fiesta
item_state = "fiesta"
/obj/item/weapon/storage/box/ingredients/fiesta/New()
..()
for(var/i in 1 to 3)
new /obj/item/weapon/reagent_containers/food/snacks/tortilla(src)
for(var/i in 1 to 2)
new /obj/item/weapon/reagent_containers/food/snacks/grown/soybeans(src)
new /obj/item/weapon/reagent_containers/food/snacks/grown/chili(src)
/obj/item/weapon/storage/box/ingredients/italian
item_state = "italian"
/obj/item/weapon/storage/box/ingredients/italian/New()
..()
for(var/i in 1 to 3)
new /obj/item/weapon/reagent_containers/food/snacks/grown/tomato(src)
new /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris(src)
new /obj/item/weapon/reagent_containers/food/snacks/faggot(src)
/obj/item/weapon/storage/box/ingredients/vegetarian
item_state = "vegetarian"
/obj/item/weapon/storage/box/ingredients/vegetarian/New()
..()
for(var/i in 1 to 3)
new /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris(src)
new /obj/item/weapon/reagent_containers/food/snacks/grown/carrot(src)
new /obj/item/weapon/reagent_containers/food/snacks/grown/eggplant(src)
new /obj/item/weapon/reagent_containers/food/snacks/grown/potato(src)
new /obj/item/weapon/reagent_containers/food/snacks/grown/apple(src)
/obj/item/weapon/storage/box/ingredients/sweets
item_state = "sweets"
/obj/item/weapon/storage/box/ingredients/sweets/New()
..()
for(var/i in 1 to 3)
new /obj/item/weapon/reagent_containers/food/snacks/chocolatebar(src)
new /obj/item/weapon/reagent_containers/food/condiment/sugar(src)
new /obj/item/weapon/reagent_containers/food/snacks/grown/cherries(src)
new /obj/item/weapon/reagent_containers/food/snacks/grown/banana(src)
new /obj/item/weapon/reagent_containers/food/snacks/icecream(src)
/obj/item/weapon/storage/box/ingredients/carnivore
item_state = "carnivore"
/obj/item/weapon/storage/box/ingredients/carnivore/New()
..()
new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/bear(src)
new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/spider(src)
new /obj/item/weapon/reagent_containers/food/snacks/carpmeat(src)
new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/slime(src)
new /obj/item/weapon/reagent_containers/food/snacks/faggot(src)
new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/corgi(src)
new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/monkey(src)
/obj/item/weapon/storage/box/ingredients/exotic
item_state = "exotic"
/obj/item/weapon/storage/box/ingredients/exotic/New()
..()
new /obj/item/weapon/reagent_containers/food/condiment/soysauce(src)
for(var/i in 1 to 2)
new /obj/item/weapon/reagent_containers/food/snacks/grown/cabbage(src)
new /obj/item/weapon/reagent_containers/food/snacks/soydope(src)
new /obj/item/weapon/reagent_containers/food/snacks/carpmeat(src)
/obj/item/weapon/storage/box/ingredients/New()
..()
if(item_state)
desc = "A box containing supplementary ingredients for the aspiring chef. This box's theme is '[item_state]'."
/obj/item/weapon/storage/box/emptysandbags
name = "box of empty sandbags"
/obj/item/weapon/storage/box/emptysandbags/New()
..()
new /obj/item/weapon/emptysandbag(src)
new /obj/item/weapon/emptysandbag(src)
new /obj/item/weapon/emptysandbag(src)
new /obj/item/weapon/emptysandbag(src)
new /obj/item/weapon/emptysandbag(src)
new /obj/item/weapon/emptysandbag(src)
new /obj/item/weapon/emptysandbag(src)
@@ -138,13 +138,14 @@
var/mob/M = usr
if(!istype(over_object, /obj/screen) || !Adjacent(M))
return ..()
if((!( M.restrained() ) && !( M.stat ) /*&& M.pocket == src*/))
switch(over_object.name)
if("r_hand")
M.unEquip(src)
if(!M.restrained() && !M.stat && istype(over_object, /obj/screen/inventory/hand))
var/obj/screen/inventory/hand/H = over_object
if(!M.unEquip(src))
return
switch(H.slot_id)
if(slot_r_hand)
M.put_in_r_hand(src)
if("l_hand")
M.unEquip(src)
if(slot_l_hand)
M.put_in_l_hand(src)
src.add_fingerprint(usr)
return
@@ -163,7 +164,7 @@
..()
for(var/i in 1 to 7)
new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf(src)
/obj/item/weapon/storage/pill_bottle/charcoal
name = "bottle of charcoal pills"
desc = "Contains pills used to counter toxins."
@@ -172,7 +173,7 @@
..()
for(var/i in 1 to 7)
new /obj/item/weapon/reagent_containers/pill/charcoal(src)
/obj/item/weapon/storage/pill_bottle/epinephrine
name = "bottle of epinephrine pills"
desc = "Contains pills used to stabilize patients."
@@ -181,7 +182,7 @@
..()
for(var/i in 1 to 7)
new /obj/item/weapon/reagent_containers/pill/epinephrine(src)
/obj/item/weapon/storage/pill_bottle/mutadone
name = "bottle of mutadone pills"
desc = "Contains pills used to treat genetic abnormalities."
@@ -190,7 +191,7 @@
..()
for(var/i in 1 to 7)
new /obj/item/weapon/reagent_containers/pill/mutadone(src)
/obj/item/weapon/storage/pill_bottle/mannitol
name = "bottle of mannitol pills"
desc = "Contains pills used to treat brain damage."
@@ -199,7 +200,7 @@
..()
for(var/i in 1 to 7)
new /obj/item/weapon/reagent_containers/pill/mannitol(src)
/obj/item/weapon/storage/pill_bottle/stimulant
name = "bottle of stimulant pills"
desc = "Guaranteed to give you that extra burst of energy during a long shift!"
@@ -51,15 +51,18 @@
return
playsound(loc, "rustle", 50, 1, -5)
switch(over_object.name)
if("r_hand")
if(!M.unEquip(src))
return
M.put_in_r_hand(src)
if("l_hand")
if(!M.unEquip(src))
return
M.put_in_l_hand(src)
if(istype(over_object, /obj/screen/inventory/hand))
var/obj/screen/inventory/hand/H = over_object
if(!M.unEquip(src))
return
switch(H.slot_id)
if(slot_r_hand)
M.put_in_r_hand(src)
if(slot_l_hand)
M.put_in_l_hand(src)
add_fingerprint(usr)
//Check if this storage can dump the items
@@ -81,15 +81,16 @@
/obj/item/weapon/watertank/MouseDrop(obj/over_object)
var/mob/M = src.loc
if(istype(M))
switch(over_object.name)
if("r_hand")
if(istype(M) && istype(over_object, /obj/screen/inventory/hand))
var/obj/screen/inventory/hand/H = over_object
switch(H.slot_id)
if(slot_r_hand)
if(M.r_hand)
return
if(!M.unEquip(src))
return
M.put_in_r_hand(src)
if("l_hand")
if(slot_l_hand)
if(M.l_hand)
return
if(!M.unEquip(src))
@@ -307,6 +307,7 @@
throw_speed = 4
embedded_impact_pain_multiplier = 3
armour_penetration = 10
materials = list(MAT_METAL=1150, MAT_GLASS=2075)
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("attacked", "poked", "jabbed", "torn", "gored")
sharpness = IS_SHARP
+1 -1
View File
@@ -85,7 +85,7 @@
force = 9
throwforce = 10
w_class = 3
materials = list(MAT_METAL=1000)
materials = list(MAT_METAL=1150, MAT_GLASS=75)
attack_verb = list("hit", "bludgeoned", "whacked", "bonked")
/obj/item/weapon/wirerod/attackby(obj/item/I, mob/user, params)
+66
View File
@@ -1,6 +1,9 @@
/obj/structure
icon = 'icons/obj/structures.dmi'
pressure_resistance = 8
var/climb_time = 20
var/climbable = FALSE
var/mob/structureclimber
/obj/structure/New()
..()
@@ -46,3 +49,66 @@
/obj/structure/proc/deconstruct(forced = FALSE)
qdel(src)
/obj/structure/MouseDrop_T(atom/movable/O, mob/user)
. = ..()
if(!climbable)
return
if(ismob(O) && user == O && ishuman(user))
if(user.canmove)
climb_structure(user)
return
if ((!( istype(O, /obj/item/weapon) ) || user.get_active_hand() != O))
return
if(isrobot(user))
return
if(!user.drop_item())
return
if (O.loc != src.loc)
step(O, get_dir(O, src))
return
/obj/structure/proc/climb_structure(mob/user)
src.add_fingerprint(user)
user.visible_message("<span class='warning'>[user] starts climbing onto [src].</span>", \
"<span class='notice'>You start climbing onto [src]...</span>")
var/climb_time = 20
if(user.restrained()) //climbing takes twice as long when restrained.
climb_time *= 2
structureclimber = user
if(do_mob(user, user, climb_time))
if(src.loc) //Checking if structure has been destroyed
density = 0
if(step(user,get_dir(user,src.loc)))
user.visible_message("<span class='warning'>[user] climbs onto [src].</span>", \
"<span class='notice'>You climb onto [src].</span>")
add_logs(user, src, "climbed onto")
user.Stun(2)
else
user << "<span class='warning'>You fail to climb onto [src].</span>"
density = 1
structureclimber = null
return 1
structureclimber = null
return ..()
/obj/structure/table/attack_hand(mob/living/user)
. = ..()
if(structureclimber && structureclimber != user)
user.changeNext_move(CLICK_CD_MELEE)
structureclimber.Weaken(2)
structureclimber.visible_message("<span class='warning'>[structureclimber.name] has been knocked off the [src]", "You're knocked off the [src]!", "You see [structureclimber.name] get knocked off the [src]</span>")
/obj/structure/CanPass(atom/movable/mover, turf/target, height=0)
if(height==0)
return 1
else
return !density
obj/structure/CanAStarPass(ID,dir,caller)
. = !density
@@ -11,10 +11,8 @@
new /obj/item/device/radio/headset/headset_cargo(src)
new /obj/item/clothing/suit/fire/firefighter(src)
new /obj/item/clothing/gloves/fingerless(src)
new /obj/item/weapon/mining_voucher(src)
new /obj/item/device/megaphone/cargo(src)
new /obj/item/weapon/tank/internals/emergency_oxygen(src)
new /obj/item/clothing/mask/gas(src)
new /obj/item/clothing/glasses/meson(src)
new /obj/item/clothing/head/soft(src)
new /obj/item/weapon/door_remote/quartermaster(src)
@@ -60,7 +60,8 @@
new /obj/item/stack/sheet/plasteel(src, 50)
new /obj/item/stack/sheet/metal(src, 50)
new /obj/item/stack/sheet/glass(src, 50)
new /obj/item/stack/sheet/mineral/sandbags(src, 30)
new /obj/item/clothing/shoes/magboots(src)
new /obj/item/weapon/storage/box/metalfoam(src)
for(var/i in 1 to 3)
for(var/i in 1 to 3)
new /obj/item/weapon/rcd_ammo/large(src)
@@ -46,7 +46,6 @@
new /obj/item/clothing/suit/armor/vest(src)
new /obj/item/device/assembly/flash/handheld(src)
new /obj/item/clothing/glasses/sunglasses(src)
new /obj/item/weapon/mining_voucher(src)
new /obj/item/weapon/restraints/handcuffs/cable/zipties(src)
new /obj/item/weapon/gun/energy/gun(src)
new /obj/item/clothing/tie/petcollar(src)
+7 -3
View File
@@ -280,6 +280,11 @@
new remains(loc)
qdel(src)
/obj/structure/girder/narsie_act()
if(prob(25))
new /obj/structure/girder/cult(loc)
qdel(src)
/obj/structure/girder/displaced
name = "displaced girder"
icon_state = "displaced"
@@ -376,9 +381,8 @@
else
..()
/obj/structure/girder/cult/blob_act()
if(prob(40))
qdel(src)
/obj/structure/girder/cult/narsie_act()
return
/obj/structure/girder/cult/ex_act(severity, target)
switch(severity)
+9 -2
View File
@@ -268,8 +268,15 @@
if(ismob(AM))
tforce = 5
else if(isobj(AM))
var/obj/item/I = AM
tforce = max(0, I.throwforce * 0.5)
if(prob(50))
var/obj/item/I = AM
tforce = max(0, I.throwforce * 0.5)
else if(anchored && !destroyed)
var/turf/T = get_turf(src)
var/obj/structure/cable/C = T.get_cable_node()
if(C)
playsound(src.loc, 'sound/magic/LightningShock.ogg', 100, 1, extrarange = 5)
tesla_zap(src, 3, C.powernet.avail * 0.08) //ZAP for 1/5000 of the amount of power, which is from 15-25 with 200000W
playsound(loc, 'sound/effects/grillehit.ogg', 80, 1)
health = max(0, health - tforce)
healthcheck()
+3 -56
View File
@@ -20,6 +20,7 @@
density = 1
anchored = 1
layer = 2.8
climbable = TRUE
pass_flags = LETPASSTHROW //You can throw objects over this, despite it's density.")
var/frame = /obj/structure/table_frame
var/framestack = /obj/item/stack/rods
@@ -27,7 +28,6 @@
var/busy = 0
var/buildstackamount = 1
var/framestackamount = 2
var/mob/tableclimber
var/deconstructable = 1
smooth = SMOOTH_TRUE
canSmoothWith = list(/obj/structure/table, /obj/structure/table/reinforced)
@@ -94,20 +94,12 @@
table_destroy(1)
return 1
/obj/structure/table/attack_hand(mob/living/user)
. = ..()
user.changeNext_move(CLICK_CD_MELEE)
if(tableclimber && tableclimber != user)
tableclimber.Weaken(2)
tableclimber.visible_message("<span class='warning'>[tableclimber.name] has been knocked off the table", "You're knocked off the table!", "You see [tableclimber.name] get knocked off the table</span>")
/obj/structure/table/attack_tk() // no telehulk sorry
return
/obj/structure/table/CanPass(atom/movable/mover, turf/target, height=0)
if(height==0)
return 1
if(istype(mover) && mover.checkpass(PASSTABLE))
return 1
if(locate(/obj/structure/table) in get_turf(mover))
@@ -121,22 +113,6 @@
var/atom/movable/mover = caller
. = . || mover.checkpass(PASSTABLE)
/obj/structure/table/MouseDrop_T(atom/movable/O, mob/user)
..()
if(ismob(O) && user == O && ishuman(user))
if(user.canmove)
climb_table(user)
return
if ((!( istype(O, /obj/item/weapon) ) || user.get_active_hand() != O))
return
if(isrobot(user))
return
if(!user.drop_item())
return
if (O.loc != src.loc)
step(O, get_dir(O, src))
return
/obj/structure/table/proc/tablepush(obj/item/I, mob/user)
if(get_dist(src, user) < 2)
var/obj/item/weapon/grab/G = I
@@ -261,36 +237,6 @@
qdel(src)
return
/*
* TABLE CLIMBING
*/
/obj/structure/table/proc/climb_table(mob/user)
src.add_fingerprint(user)
user.visible_message("<span class='warning'>[user] starts climbing onto [src].</span>", \
"<span class='notice'>You start climbing onto [src]...</span>")
var/climb_time = 20
if(user.restrained()) //Table climbing takes twice as long when restrained.
climb_time *= 2
tableclimber = user
if(do_mob(user, user, climb_time))
if(src.loc) //Checking if table has been destroyed
density = 0
if(step(user,get_dir(user,src.loc)))
user.visible_message("<span class='warning'>[user] climbs onto [src].</span>", \
"<span class='notice'>You climb onto [src].</span>")
add_logs(user, src, "climbed onto")
user.Stun(2)
else
user << "<span class='warning'>You fail to climb onto [src].</span>"
density = 1
tableclimber = null
return 1
tableclimber = null
return 0
/*
* Glass tables
*/
@@ -311,7 +257,7 @@
qdel(src)
/obj/structure/table/glass/climb_table(mob/user)
/obj/structure/table/glass/climb_structure(mob/user)
if(..())
visible_message("<span class='warning'>[src] breaks!</span>")
playsound(src.loc, "shatter", 50, 1)
@@ -592,3 +538,4 @@
R.add_fingerprint(user)
qdel(src)
return
-4
View File
@@ -19,7 +19,6 @@
/turf/open/handle_slip(mob/living/carbon/C, s_amount, w_amount, obj/O, lube)
if(has_gravity(src))
var/obj/buckled_obj
var/oldlying = C.lying
if(C.buckled)
buckled_obj = C.buckled
if(!(lube&GALOSHES_DONT_HELP)) //can't slip while buckled unless it's lube.
@@ -50,9 +49,6 @@
spawn (i)
step(C, olddir)
C.spin(1,1)
if(C.lying != oldlying && lube) //did we actually fall?
var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg")
C.apply_damage(5, BRUTE, dam_zone)
return 1
/turf/open/proc/MakeSlippery(wet_setting = TURF_WET_WATER) // 1 = Water, 2 = Lube, 3 = Ice
+7
View File
@@ -12,14 +12,21 @@
var/destination_y
var/global/datum/gas_mixture/space/space_gas = new
var/global/list/turf/open/space/space_turfs = list()
/turf/open/space/New()
update_icon()
air = space_gas
space_turfs += src
/turf/open/space/Destroy()
return QDEL_HINT_LETMELIVE
/turf/open/space/ChangeTurf(path)
. = ..()
if(!istype(., /turf/open/space))
space_turfs -= src
/turf/open/space/proc/update_starlight()
if(config.starlight)
for(var/t in RANGE_TURFS(1,src)) //RANGE_TURFS is in code\__HELPERS\game.dm
+52 -8
View File
@@ -33,10 +33,10 @@ var/list/VVckey_edit = list("key", "ckey")
var/class = "text"
if(src.holder && src.holder.marked_datum)
class = input("What kind of variable?","Variable Type") as null|anything in list("text",
"num","type","reference","mob reference", "icon","file","list","edit referenced object","restore to default","marked datum ([holder.marked_datum.type])")
"num","type","reference","mob reference", "icon","file","list","edit referenced object","restore to default", "new atom", "new datum", "marked datum ([holder.marked_datum.type])")
else
class = input("What kind of variable?","Variable Type") as null|anything in list("text",
"num","type","reference","mob reference", "icon","file","list","edit referenced object","restore to default")
"num","type","reference","mob reference", "icon","file","list","edit referenced object","restore to default", "new atom", "new datum")
if(!class)
return
@@ -72,6 +72,14 @@ var/list/VVckey_edit = list("key", "ckey")
if("marked datum")
var_value = holder.marked_datum
if("new atom")
var/type = input("Enter type:","Type") as null|anything in typesof(/obj,/mob,/area,/turf)
var_value = new type()
if("new datum")
var/type = input("Enter type:","Type") as null|anything in (typesof(/datum)-typesof(/obj,/mob,/area,/turf))
var_value = new type()
if(!var_value) return
if(istext(var_value))
@@ -90,10 +98,10 @@ var/list/VVckey_edit = list("key", "ckey")
var/class = "text"
if(src.holder && src.holder.marked_datum)
class = input("What kind of variable?","Variable Type") as null|anything in list("text",
"num","type","reference","mob reference", "icon","file","list","edit referenced object","restore to default","marked datum ([holder.marked_datum.type])")
"num","type","reference","mob reference", "icon","file","list","edit referenced object","restore to default", "new atom", "new datum","marked datum ([holder.marked_datum.type])")
else
class = input("What kind of variable?","Variable Type") as null|anything in list("text",
"num","type","reference","mob reference", "icon","file","list","edit referenced object","restore to default")
"num","type","reference","mob reference", "icon","file","list","edit referenced object","restore to default", "new atom", "new datum")
if(!class)
return
@@ -129,6 +137,14 @@ var/list/VVckey_edit = list("key", "ckey")
if("marked datum")
var_value = holder.marked_datum
if("new atom")
var/type = input("Enter type:","Type") as null|anything in typesof(/obj,/mob,/area,/turf)
var_value = new type()
if("new datum")
var/type = input("Enter type:","Type") as null|anything in (typesof(/datum)-typesof(/obj,/mob,/area,/turf))
var_value = new type()
if(!var_value) return
if(istext(var_value))
@@ -267,10 +283,10 @@ var/list/VVckey_edit = list("key", "ckey")
var/class = "text"
if(src.holder && src.holder.marked_datum)
class = input("What kind of variable?","Variable Type",default) as null|anything in list("text",
"num","type","reference","mob reference", "icon","file","list","edit referenced object","restore to default","marked datum ([holder.marked_datum.type])", "DELETE FROM LIST")
"num","type","reference","mob reference", "icon","file","list","edit referenced object","restore to default", "new atom", "new datum","marked datum ([holder.marked_datum.type])", "DELETE FROM LIST")
else
class = input("What kind of variable?","Variable Type",default) as null|anything in list("text",
"num","type","reference","mob reference", "icon","file","list","edit referenced object","restore to default", "DELETE FROM LIST")
"num","type","reference","mob reference", "icon","file","list","edit referenced object","restore to default", "new atom", "new datum", "DELETE FROM LIST")
if(!class)
return
@@ -372,6 +388,22 @@ var/list/VVckey_edit = list("key", "ckey")
else
L[L.Find(variable)] = new_var
if("new atom")
var/type = input("Enter type:","Type") as null|anything in typesof(/obj,/mob,/area,/turf)
new_var = new type()
if(assoc)
L[assoc_key] = new_var
else
L[L.Find(variable)] = new_var
if("new datum")
var/type = input("Enter type:","Type") as null|anything in (typesof(/datum)-typesof(/obj,/mob,/area,/turf))
new_var = new type()
if(assoc)
L[assoc_key] = new_var
else
L[L.Find(variable)] = new_var
O.on_varedit(objectvar)
world.log << "### ListVarEdit by [src]: [O.type] [objectvar]: [original_var]=[new_var]"
log_admin("[key_name(src)] modified [original_name]'s [objectvar]: [original_var]=[new_var]")
@@ -541,10 +573,10 @@ var/list/VVckey_edit = list("key", "ckey")
if(src.holder && src.holder.marked_datum)
class = input("What kind of variable?","Variable Type",default) as null|anything in list("text",
"num","type","reference","mob reference", "icon","file","list","edit referenced object","restore to default","marked datum ([holder.marked_datum.type])")
"num","type","reference","mob reference", "icon","file","list","edit referenced object","restore to default", "new atom", "new datum", "marked datum ([holder.marked_datum.type])")
else
class = input("What kind of variable?","Variable Type",default) as null|anything in list("text",
"num","type","reference","mob reference", "icon","file","list","edit referenced object","restore to default")
"num","type","reference","mob reference", "icon","file","list","edit referenced object","restore to default", "new atom", "new datum")
if(!class)
return
@@ -638,6 +670,18 @@ var/list/VVckey_edit = list("key", "ckey")
if("marked datum")
O.vars[variable] = holder.marked_datum
if("new atom")
var/type = input("Enter type:","Type") as null|anything in typesof(/obj,/mob,/area,/turf)
var/var_new = new type()
if(var_new==null) return
O.vars[variable] = var_new
if("new datum")
var/type = input("Enter type:","Type") as null|anything in (typesof(/datum)-typesof(/obj,/mob,/area,/turf))
var/var_new = new type()
if(var_new==null) return
O.vars[variable] = var_new
O.on_varedit(variable)
world.log << "### VarEdit by [src]: [O.type] [variable]=[html_encode("[O.vars[variable]]")]"
log_admin("[key_name(src)] modified [original_name]'s [variable] to [O.vars[variable]]")
+8 -2
View File
@@ -7,8 +7,13 @@ var/sound/admin_sound
if(!check_rights(R_SOUNDS))
return
admin_sound = sound(S, repeat = 0, wait = 1, channel = SOUND_CHANNEL_ADMIN)
var/sound/admin_sound = new()
admin_sound.file = S
admin_sound.priority = 250
admin_sound.channel = SOUND_CHANNEL_ADMIN
admin_sound.wait = 1
admin_sound.repeat = 0
admin_sound.status = SOUND_UPDATE|SOUND_STREAM
log_admin("[key_name(src)] played sound [S]")
@@ -20,7 +25,8 @@ var/sound/admin_sound
for(var/mob/M in player_list)
if(M.client.prefs.toggles & SOUND_MIDI)
M << admin_sound
var/vol = M.client.prefs.adminmusicvolume
M << sound(admin_sound,channel = SOUND_CHANNEL_ADMIN,volume=vol)
admin_sound.frequency = 1 //Remove this line when the AFD stuff above is gone
admin_sound.wait = 0
+1 -1
View File
@@ -62,7 +62,7 @@ var/list/preferences_datums = list()
var/list/features = list("mcolor" = "FFF", "tail_lizard" = "Smooth", "tail_human" = "None", "snout" = "Round", "horns" = "None", "ears" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None")
var/list/custom_names = list("clown", "mime", "ai", "cyborg", "religion", "deity")
var/adminmusicvolume = 50
//Mob preview
var/icon/preview_icon = null
@@ -223,6 +223,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["preferred_map"] >> preferred_map
S["ignoring"] >> ignoring
S["ghost_hud"] >> ghost_hud
S["adminmusicvolume"] >> adminmusicvolume
S["inquisitive_ghost"] >> inquisitive_ghost
//try to fix any outdated data if necessary
@@ -274,6 +275,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["preferred_map"] << preferred_map
S["ignoring"] << ignoring
S["ghost_hud"] << ghost_hud
S["adminmusicvolume"] << adminmusicvolume
S["inquisitive_ghost"] << inquisitive_ghost
return 1
@@ -333,3 +333,12 @@ var/global/list/ghost_orbits = list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS
src << "You will now [(prefs.toggles & SOUND_ANNOUNCEMENTS) ? "no longer hear announcements" : "hear announcement sounds"]."
prefs.save_preferences()
feedback_add_details("admin_verb","TAS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/verb/set_admin_volume()
set name = "Set Admin Music Volume"
set category = "Preferences"
set desc = "Set the volume you hear admin music at."
var/musinput = input("Range of 0 to 100.","Admin Music Volume", prefs.adminmusicvolume) as num
prefs.adminmusicvolume = max(0,min(musinput,100))
prefs.save_preferences()
+1 -1
View File
@@ -178,7 +178,7 @@ BLIND // can't see anything
var/list/bloody_shoes = list(BLOOD_STATE_HUMAN = 0,BLOOD_STATE_XENO = 0, BLOOD_STATE_OIL = 0, BLOOD_STATE_NOT_BLOODY = 0)
var/can_hold_items = 0//if set to 1, the shoe can hold knives and edaggers
var/obj/held_item
var/list/valid_held_items = list(/obj/item/weapon/kitchen/knife, /obj/item/weapon/pen, /obj/item/weapon/switchblade)//can hold both regular pens and energy daggers. made for your every-day tactical librarians/murderers.
var/list/valid_held_items = list(/obj/item/weapon/kitchen/knife, /obj/item/weapon/pen, /obj/item/weapon/switchblade, /obj/item/weapon/scalpel, /obj/item/weapon/reagent_containers/syringe, /obj/item/weapon/dnainjector)//can hold both regular pens and energy daggers. made for your every-day tactical librarians/murderers.
/obj/item/clothing/shoes/worn_overlays(var/isinhands = FALSE)
+20 -1
View File
@@ -84,7 +84,26 @@
item_state = "glasses"
origin_tech = "magnets=3;engineering=3"
vision_flags = SEE_OBJS
invis_view = SEE_INVISIBLE_MINIMUM
/obj/item/clothing/glasses/material/mining
name = "Optical Material Scanner"
desc = "Used by miners to detect ores deep within the rock."
icon_state = "material"
item_state = "glasses"
origin_tech = "magnets=3;engineering=3"
darkness_view = 0
/obj/item/clothing/glasses/material/mining/gar
name = "gar material scanner"
icon_state = "garm"
item_state = "garm"
desc = "Do the impossible, see the invisible!"
force = 10
throwforce = 20
throw_speed = 4
attack_verb = list("sliced")
hitsound = 'sound/weapons/bladeslice.ogg'
sharpness = IS_SHARP
/obj/item/clothing/glasses/regular
name = "Prescription Glasses"
+5
View File
@@ -17,6 +17,7 @@
name = "head of security's cloak"
desc = "Worn by Securistan, ruling the station with an iron fist. It's slightly armored."
icon_state = "hoscloak"
allowed = list(/obj/item/weapon/gun/energy/gun/hos)
armor = list(melee = 30, bullet = 30, laser = 10, energy = 10, bomb = 25, bio = 0, rad = 0)
/obj/item/clothing/suit/cloak/qm
@@ -27,24 +28,28 @@
name = "chief medical officer's cloak"
desc = "Worn by Meditopia, the valiant men and women keeping pestilence at bay. It's slightly shielded from contaminants."
icon_state = "cmocloak"
allowed = list(/obj/item/weapon/reagent_containers/hypospray/CMO)
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 25, rad = 0)
/obj/item/clothing/suit/cloak/ce
name = "chief engineer's cloak"
desc = "Worn by Engitopia, wielders of an unlimited power. It's slightly shielded against radiation."
icon_state = "cecloak"
allowed = list(/obj/item/weapon/rcd, /obj/item/weapon/pipe_dispenser)
armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 10)
/obj/item/clothing/suit/cloak/rd
name = "research director's cloak."
desc = "Worn by Sciencia, thaumaturges and researchers of the universe. It's slightly shielded from contaminants."
icon_state = "rdcloak"
allowed = list(/obj/item/weapon/hand_tele, /obj/item/weapon/storage/part_replacer)
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 10, bio = 10, rad = 0)
/obj/item/clothing/suit/cloak/cap
name = "captain's cloak"
desc = "Worn by the commander of Space Station 13."
icon_state = "capcloak"
allowed = list(/obj/item/weapon/gun/energy/laser/captain)
armor = list(melee = 30, bullet = 30, laser = 30, energy = 10, bomb = 25, bio = 10, rad = 10)
/* //wip
+9 -1
View File
@@ -171,4 +171,12 @@
name = "shaft miner's jumpsuit"
icon_state = "miner"
item_state = "miner"
item_color = "miner"
item_color = "miner"
/obj/item/clothing/under/rank/miner/lavaland
desc = "A black jumpsuit for operating in hazardous environments."
name = "shaft miner's jumpsuit"
icon_state = "syndicate"
item_state = "bl_suit"
item_color = "syndicate"
+8
View File
@@ -172,6 +172,14 @@
time = 10
category = CAT_WEAPON
/datum/table_recipe/sandbags
name = "Sandbags"
result = /obj/item/stack/sheet/mineral/sandbags
reqs = list(/obj/item/weapon/ore/glass = 5,
/obj/item/weapon/emptysandbag = 1)
time = 10
category = CAT_WEAPON
/datum/table_recipe/meteorshot
name = "Meteorshot Shell"
result = /obj/item/ammo_casing/shotgun/meteorshot
@@ -1,127 +1,153 @@
//this datum is used by the events controller to dictate how it selects events
/datum/round_event_control
var/name //The name human-readable name of the event
var/typepath //The typepath of the event datum /datum/round_event
var/weight = 10 //The weight this event has in the random-selection process.
//Higher weights are more likely to be picked.
//10 is the default weight. 20 is twice more likely; 5 is half as likely as this default.
var/earliest_start = 12000 //The earliest world.time that an event can start (round-duration in deciseconds) default: 20 mins
var/occurrences = 0 //How many times this event has occured
var/max_occurrences = 20 //The maximum number of times this event can occur (naturally), it can still be forced.
//By setting this to 0 you can effectively disable an event.
var/holidayID = "" //string which should be in the SSevents.holidays list if you wish this event to be holiday-specific
//anything with a (non-null) holidayID which does not match holiday, cannot run.
var/wizardevent = 0
var/alertadmins = 1 //should we let the admins know this event is firing
//should be disabled on events that fire a lot
var/list/gamemode_blacklist = list() // Event won't happen in these gamemodes
var/list/gamemode_whitelist = list() // Event will happen ONLY in these gamemodes if not empty
/datum/round_event_control/wizard
wizardevent = 1
/datum/round_event_control/proc/runEvent()
if(!ispath(typepath,/datum/round_event))
return PROCESS_KILL
var/datum/round_event/E = new typepath()
E.control = src
feedback_add_details("event_ran","[E]")
occurrences++
testing("[time2text(world.time, "hh:mm:ss")] [E.type]")
return E
/datum/round_event //NOTE: Times are measured in master controller ticks!
var/processing = 1
var/datum/round_event_control/control
var/startWhen = 0 //When in the lifetime to call start().
var/announceWhen = 0 //When in the lifetime to call announce(). Set an event's announceWhen to >0 if there is an announcement.
var/endWhen = 0 //When in the lifetime the event should end.
var/activeFor = 0 //How long the event has existed. You don't need to change this.
//Called first before processing.
//Allows you to setup your event, such as randomly
//setting the startWhen and or announceWhen variables.
//Only called once.
//EDIT: if there's anything you want to override within the new() call, it will not be overridden by the time this proc is called.
//It will only have been overridden by the time we get to announce() start() tick() or end() (anything but setup basically).
//This is really only for setting defaults which can be overridden later when New() finishes.
/datum/round_event/proc/setup()
return
//Called when the tick is equal to the startWhen variable.
//Allows you to start before announcing or vice versa.
//Only called once.
/datum/round_event/proc/start()
return
//Called when the tick is equal to the announceWhen variable.
//Allows you to announce before starting or vice versa.
//Only called once.
/datum/round_event/proc/announce()
return
//Called on or after the tick counter is equal to startWhen.
//You can include code related to your event or add your own
//time stamped events.
//Called more than once.
/datum/round_event/proc/tick()
return
//Called on or after the tick is equal or more than endWhen
//You can include code related to the event ending.
//Do not place spawn() in here, instead use tick() to check for
//the activeFor variable.
//For example: if(activeFor == myOwnVariable + 30) doStuff()
//Only called once.
/datum/round_event/proc/end()
return
//Do not override this proc, instead use the appropiate procs.
//This proc will handle the calls to the appropiate procs.
/datum/round_event/process()
if(!processing)
return
if(activeFor == startWhen)
start()
if(activeFor == announceWhen)
announce()
if(startWhen < activeFor && activeFor < endWhen)
tick()
if(activeFor == endWhen)
end()
// Everything is done, let's clean up.
if(activeFor >= endWhen && activeFor >= announceWhen && activeFor >= startWhen)
kill()
activeFor++
//Garbage collects the event by removing it from the global events list,
//which should be the only place it's referenced.
//Called when start(), announce() and end() has all been called.
/datum/round_event/proc/kill()
SSevent.running -= src
//Sets up the event then adds the event to the the list of running events
/datum/round_event/New()
setup()
SSevent.running += src
//this datum is used by the events controller to dictate how it selects events
/datum/round_event_control
var/name //The human-readable name of the event
var/typepath //The typepath of the event datum /datum/round_event
var/weight = 10 //The weight this event has in the random-selection process.
//Higher weights are more likely to be picked.
//10 is the default weight. 20 is twice more likely; 5 is half as likely as this default.
var/earliest_start = 12000 //The earliest world.time that an event can start (round-duration in deciseconds) default: 20 mins
var/min_players = 0 //The minimum amount of alive, non-AFK human players on server required to start the event.
var/occurrences = 0 //How many times this event has occured
var/max_occurrences = 20 //The maximum number of times this event can occur (naturally), it can still be forced.
//By setting this to 0 you can effectively disable an event.
var/holidayID = "" //string which should be in the SSevents.holidays list if you wish this event to be holiday-specific
//anything with a (non-null) holidayID which does not match holiday, cannot run.
var/wizardevent = 0
var/alertadmins = 1 //should we let the admins know this event is firing
//should be disabled on events that fire a lot
var/list/gamemode_blacklist = list() // Event won't happen in these gamemodes
var/list/gamemode_whitelist = list() // Event will happen ONLY in these gamemodes if not empty
/datum/round_event_control/New()
..()
if(config && !wizardevent) // Magic is unaffected by configs
earliest_start = Ceiling(earliest_start * config.events_min_time_mul)
min_players = Ceiling(min_players * config.events_min_players_mul)
/datum/round_event_control/wizard
wizardevent = 1
// Checks if the event can be spawned. Used by event controller and "false alarm" event.
// Admin-created events override this.
/datum/round_event_control/proc/canSpawnEvent(var/players_amt, var/gamemode)
if(occurrences >= max_occurrences)
return FALSE
if(earliest_start >= world.time)
return FALSE
if(players_amt < min_players)
return FALSE
if(gamemode_blacklist.len && (gamemode in gamemode_blacklist))
return FALSE
if(gamemode_whitelist.len && !(gamemode in gamemode_whitelist))
return FALSE
if(holidayID && (!SSevent.holidays || !SSevent.holidays[holidayID]))
return FALSE
return TRUE
/datum/round_event_control/proc/runEvent()
if(!ispath(typepath,/datum/round_event))
return PROCESS_KILL
var/datum/round_event/E = new typepath()
E.current_players = get_active_player_count(alive_check = 1, afk_check = 1, human_check = 1)
E.control = src
feedback_add_details("event_ran","[E]")
occurrences++
testing("[time2text(world.time, "hh:mm:ss")] [E.type]")
return E
/datum/round_event //NOTE: Times are measured in master controller ticks!
var/processing = 1
var/datum/round_event_control/control
var/startWhen = 0 //When in the lifetime to call start().
var/announceWhen = 0 //When in the lifetime to call announce(). Set an event's announceWhen to >0 if there is an announcement.
var/endWhen = 0 //When in the lifetime the event should end.
var/activeFor = 0 //How long the event has existed. You don't need to change this.
var/current_players = 0 //Amount of of alive, non-AFK human players on server at the time of event start
//Called first before processing.
//Allows you to setup your event, such as randomly
//setting the startWhen and or announceWhen variables.
//Only called once.
//EDIT: if there's anything you want to override within the new() call, it will not be overridden by the time this proc is called.
//It will only have been overridden by the time we get to announce() start() tick() or end() (anything but setup basically).
//This is really only for setting defaults which can be overridden later when New() finishes.
/datum/round_event/proc/setup()
return
//Called when the tick is equal to the startWhen variable.
//Allows you to start before announcing or vice versa.
//Only called once.
/datum/round_event/proc/start()
return
//Called when the tick is equal to the announceWhen variable.
//Allows you to announce before starting or vice versa.
//Only called once.
/datum/round_event/proc/announce()
return
//Called on or after the tick counter is equal to startWhen.
//You can include code related to your event or add your own
//time stamped events.
//Called more than once.
/datum/round_event/proc/tick()
return
//Called on or after the tick is equal or more than endWhen
//You can include code related to the event ending.
//Do not place spawn() in here, instead use tick() to check for
//the activeFor variable.
//For example: if(activeFor == myOwnVariable + 30) doStuff()
//Only called once.
/datum/round_event/proc/end()
return
//Do not override this proc, instead use the appropiate procs.
//This proc will handle the calls to the appropiate procs.
/datum/round_event/process()
if(!processing)
return
if(activeFor == startWhen)
start()
if(activeFor == announceWhen)
announce()
if(startWhen < activeFor && activeFor < endWhen)
tick()
if(activeFor == endWhen)
end()
// Everything is done, let's clean up.
if(activeFor >= endWhen && activeFor >= announceWhen && activeFor >= startWhen)
kill()
activeFor++
//Garbage collects the event by removing it from the global events list,
//which should be the only place it's referenced.
//Called when start(), announce() and end() has all been called.
/datum/round_event/proc/kill()
SSevent.running -= src
//Sets up the event then adds the event to the the list of running events
/datum/round_event/New()
setup()
SSevent.running += src
return ..()
+1
View File
@@ -4,6 +4,7 @@
weight = 5
max_occurrences = 1
min_players = 5
earliest_start = 18000 // 30 min
gamemode_blacklist = list("nuclear","wizard","revolution","abduction")
+2
View File
@@ -2,6 +2,8 @@
name = "Alien Infestation"
typepath = /datum/round_event/alien_infestation
weight = 5
min_players = 10
max_occurrences = 1
/datum/round_event/alien_infestation
+2
View File
@@ -1,6 +1,8 @@
/datum/round_event_control/anomaly
name = "Anomaly: Energetic Flux"
typepath = /datum/round_event/anomaly
min_players = 1
max_occurrences = 0 //This one probably shouldn't occur! It'd work, but it wouldn't be very fun.
weight = 15
+2
View File
@@ -1,6 +1,8 @@
/datum/round_event_control/anomaly/anomaly_flux
name = "Anomaly: Hyper-Energetic Flux"
typepath = /datum/round_event/anomaly/anomaly_flux
min_players = 10
max_occurrences = 5
weight = 20
+2
View File
@@ -1,6 +1,8 @@
/datum/round_event_control/anomaly/anomaly_vortex
name = "Anomaly: Vortex"
typepath = /datum/round_event/anomaly/anomaly_vortex
min_players = 20
max_occurrences = 2
weight = 5
+1
View File
@@ -4,6 +4,7 @@
weight = 5
max_occurrences = 1
min_players = 20
earliest_start = 18000 //30 minutes
gamemode_blacklist = list("blob") //Just in case a blob survives that long
@@ -2,6 +2,8 @@
name = "Brand Intelligence"
typepath = /datum/round_event/brand_intelligence
weight = 5
min_players = 15
max_occurrences = 1
/datum/round_event/brand_intelligence
+1
View File
@@ -2,6 +2,7 @@
name = "Carp Migration"
typepath = /datum/round_event/carp_migration
weight = 15
min_players = 2
earliest_start = 6000
max_occurrences = 6
+1
View File
@@ -2,6 +2,7 @@
name = "Disease Outbreak"
typepath = /datum/round_event/disease_outbreak
max_occurrences = 1
min_players = 10
weight = 5
/datum/round_event/disease_outbreak
+1
View File
@@ -2,6 +2,7 @@
name = "Electrical Storm"
typepath = /datum/round_event/electrical_storm
earliest_start = 6000
min_players = 5
weight = 40
alertadmins = 0
+6 -3
View File
@@ -10,11 +10,14 @@
/datum/round_event/falsealarm/announce()
var/list/events_list = list()
var/players_amt = get_active_player_count(alive_check = 1, afk_check = 1, human_check = 1)
var/gamemode = ticker.mode.config_tag
for(var/datum/round_event_control/E in SSevent.control)
if(E.holidayID || E.wizardevent)
continue
if(E.earliest_start >= world.time)
if(!E.canSpawnEvent(players_amt, gamemode))
continue
var/datum/round_event/event = E.typepath
if(initial(event.announceWhen) <= 0)
continue
+1
View File
@@ -10,6 +10,7 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
/datum/round_event_control/immovable_rod
name = "Immovable Rod"
typepath = /datum/round_event/immovable_rod
min_players = 15
max_occurrences = 5
/datum/round_event/immovable_rod
+1
View File
@@ -5,6 +5,7 @@
name = "Ion Storm"
typepath = /datum/round_event/ion_storm
weight = 15
min_players = 2
/datum/round_event/ion_storm
var/botEmagChance = 10
@@ -3,6 +3,7 @@
typepath = /datum/round_event/mass_hallucination
weight = 7
max_occurrences = 2
min_players = 1
/datum/round_event/mass_hallucination/start()
for(var/mob/living/carbon/C in living_mob_list)
+1
View File
@@ -2,6 +2,7 @@
name = "Meteor Wave"
typepath = /datum/round_event/meteor_wave
weight = 5
min_players = 5
max_occurrences = 3
/datum/round_event/meteor_wave
+1
View File
@@ -2,6 +2,7 @@
name = "Portal Storm: Syndicate Shocktroops"
typepath = /datum/round_event/portal_storm/syndicate_shocktroop
weight = 2
min_players = 15
earliest_start = 18000
/datum/round_event/portal_storm/syndicate_shocktroop
+1
View File
@@ -2,6 +2,7 @@
name = "Prison Break"
typepath = /datum/round_event/prison_break
max_occurrences = 2
min_players = 5
/datum/round_event/prison_break
announceWhen = 50
+1
View File
@@ -3,6 +3,7 @@
typepath = /datum/round_event/spacevine
weight = 15
max_occurrences = 3
min_players = 10
/datum/round_event/spacevine/start()
var/list/turfs = list() //list of all the empty floor turfs in the hallway areas
@@ -3,6 +3,7 @@
typepath = /datum/round_event/spider_infestation
weight = 5
max_occurrences = 1
min_players = 15
/datum/round_event/spider_infestation
announceWhen = 400
@@ -4,6 +4,7 @@
weight = 20
max_occurrences = 4
earliest_start = 6000
min_players = 5 // To make your chance of getting help a bit higher.
/datum/round_event/spontaneous_appendicitis/start()
for(var/mob/living/carbon/human/H in shuffle(living_mob_list))
+1
View File
@@ -3,6 +3,7 @@
typepath = /datum/round_event/wormholes
max_occurrences = 3
weight = 2
min_players = 2
/datum/round_event/wormholes
@@ -241,6 +241,11 @@
icon_state = "absinthebottle"
list_reagents = list("absinthe" = 100)
/obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe/premium
name = "Gwyn's Premium Absinthe"
desc = "A potent alcoholic beverage, almost makes you forget the ash in your lungs."
icon_state = "absinthepremium"
//////////////////////////JUICES AND STUFF ///////////////////////
/obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice
@@ -165,6 +165,13 @@
list_reagents = list("rice" = 30)
possible_states = list()
/obj/item/weapon/reagent_containers/food/condiment/soysauce
name = "soy sauce"
desc = "A salty soy-based flavoring."
icon_state = "soysauce"
list_reagents = list("soysauce" = 50)
possible_states = list()
//Food packs. To easily apply deadly toxi... delicious sauces to your food!
@@ -170,7 +170,16 @@
slice_path = /obj/item/weapon/reagent_containers/food/snacks/meat/rawcutlet/spider
/obj/item/weapon/reagent_containers/food/snacks/meat/slab/goliath
name = "goliath meat"
desc = "A slab of goliath meat. It's not very edible now, but it cooks great in lava."
list_reagents = list("nutriment" = 3, "toxin" = 5)
/obj/item/weapon/reagent_containers/food/snacks/meat/slab/goliath/burn()
visible_message("\The [src] finishes cooking!")
new/obj/item/weapon/reagent_containers/food/snacks/meat/steak/goliath/(src.loc)
SSobj.burning -= src
qdel(src)
////////////////////////////////////// MEAT STEAKS ///////////////////////////////////////////////////////////
@@ -200,6 +209,10 @@
/obj/item/weapon/reagent_containers/food/snacks/meat/steak/spider
name = "spider steak"
/obj/item/weapon/reagent_containers/food/snacks/meat/steak/goliath
name = "goliath steak"
desc = "A delicious, lava cooked steak."
burn_state = LAVA_PROOF
//////////////////////////////// MEAT CUTLETS ///////////////////////////////////////////////////////
+87 -37
View File
@@ -141,8 +141,10 @@
dat += "<div class='statusDisplay'>"
dat += "10 milk: <A href='?src=\ref[src];create=milk;amount=1'>Make</A><A href='?src=\ref[src];create=milk;amount=5'>x5</A> ([20/efficiency])<BR>"
dat += "10 cream: <A href='?src=\ref[src];create=cream;amount=1'>Make</A><A href='?src=\ref[src];create=cream;amount=5'>x5</A> ([30/efficiency])<BR>"
dat += "Milk Carton: <A href='?src=\ref[src];create=cmilk;amount=1'>Make</A><A href='?src=\ref[src];create=cmilk;amount=5'>x5</A> ([100/efficiency])<BR>"
dat += "Cream Carton: <A href='?src=\ref[src];create=ccream;amount=1'>Make</A><A href='?src=\ref[src];create=ccream;amount=5'>x5</A> ([300/efficiency])<BR>"
dat += "Milk carton: <A href='?src=\ref[src];create=cmilk;amount=1'>Make</A><A href='?src=\ref[src];create=cmilk;amount=5'>x5</A> ([100/efficiency])<BR>"
dat += "Cream carton: <A href='?src=\ref[src];create=ccream;amount=1'>Make</A><A href='?src=\ref[src];create=ccream;amount=5'>x5</A> ([300/efficiency])<BR>"
dat += "10u black pepper: <A href='?src=\ref[src];create=bpepper;amount=1'>Make</A><A href='?src=\ref[src];create=bpepper;amount=5'>x5</A> ([25/efficiency])<BR>"
dat += "Pepper mill: <A href='?src=\ref[src];create=mpepper;amount=1'>Make</A><A href='?src=\ref[src];create=mpepper;amount=5'>x5</A> ([50/efficiency])<BR>"
dat += "Monkey cube: <A href='?src=\ref[src];create=meat;amount=1'>Make</A><A href='?src=\ref[src];create=meat;amount=5'>x5</A> ([250/efficiency])"
dat += "</div>"
dat += "<h3>Botany Chemicals:</h3>"
@@ -152,11 +154,13 @@
dat += "Robust Harvest: <A href='?src=\ref[src];create=rh;amount=1'>Make</A><A href='?src=\ref[src];create=rh;amount=5'>x5</A> ([25/efficiency])<BR>"
dat += "Weed Killer: <A href='?src=\ref[src];create=wk;amount=1'>Make</A><A href='?src=\ref[src];create=wk;amount=5'>x5</A> ([50/efficiency])<BR>"
dat += "Pest Killer: <A href='?src=\ref[src];create=pk;amount=1'>Make</A><A href='?src=\ref[src];create=pk;amount=5'>x5</A> ([50/efficiency])<BR>"
dat += "Empty bottle: <A href='?src=\ref[src];create=empty;amount=1'>Make</A><A href='?src=\ref[src];create=empty;amount=5'>x5</A> ([5/efficiency])<BR>"
dat += "</div>"
dat += "<h3>Leather and Cloth:</h3>"
dat += "<div class='statusDisplay'>"
dat += "Wallet: <A href='?src=\ref[src];create=wallet;amount=1'>Make</A> ([100/efficiency])<BR>"
dat += "Book bag: <A href='?src=\ref[src];create=bkbag;amount=1'>Make</A> ([200/efficiency])<BR>"
dat += "Empty sandbag: <A href='?src=\ref[src];create=sdbag;amount=1'>Make</A> ([200/efficiency])<BR>"
dat += "Plant bag: <A href='?src=\ref[src];create=ptbag;amount=1'>Make</A> ([200/efficiency])<BR>"
dat += "Rag: <A href='?src=\ref[src];create=rag;amount=1'>Make</A> ([200/efficiency])<BR>"
dat += "Mining satchel: <A href='?src=\ref[src];create=mnbag;amount=1'>Make</A> ([200/efficiency])<BR>"
@@ -168,10 +172,10 @@
dat += "Janitorial belt: <A href='?src=\ref[src];create=jbelt;amount=1'>Make</A> ([300/efficiency])<BR>"
dat += "Bandolier belt: <A href='?src=\ref[src];create=bbelt;amount=1'>Make</A> ([300/efficiency])<BR>"
dat += "Shoulder holster: <A href='?src=\ref[src];create=sholster;amount=1'>Make</A> ([400/efficiency])<BR>"
dat += "Leather Satchel: <A href='?src=\ref[src];create=satchel;amount=1'>Make</A> ([400/efficiency])<BR>"
dat += "Leather Jacket: <A href='?src=\ref[src];create=jacket;amount=1'>Make</A> ([500/efficiency])<BR>"
dat += "Leather Overcoat: <A href='?src=\ref[src];create=overcoat;amount=1'>Make</A> ([1000/efficiency])<BR>"
dat += "Rice Hat: <A href='?src=\ref[src];create=rice_hat;amount=1'>Make</A> ([300/efficiency])<BR>"
dat += "Leather satchel: <A href='?src=\ref[src];create=satchel;amount=1'>Make</A> ([400/efficiency])<BR>"
dat += "Leather jacket: <A href='?src=\ref[src];create=jacket;amount=1'>Make</A> ([500/efficiency])<BR>"
dat += "Leather overcoat: <A href='?src=\ref[src];create=overcoat;amount=1'>Make</A> ([1000/efficiency])<BR>"
dat += "Rice hat: <A href='?src=\ref[src];create=rice_hat;amount=1'>Make</A> ([300/efficiency])<BR>"
dat += "</div>"
else
dat += "<div class='statusDisplay'>No container inside, please insert container.</div>"
@@ -231,87 +235,133 @@
/obj/machinery/biogenerator/proc/create_product(create)
switch(create)
if("milk")
if(check_container_volume(10)) return 0
else if (check_cost(20/efficiency)) return 0
if(check_container_volume(10))
return 0
else if (check_cost(20/efficiency))
return 0
else beaker.reagents.add_reagent("milk",10)
if("bpepper")
if(check_container_volume(10))
return 0
else if (check_cost(25/efficiency))
return 0
else beaker.reagents.add_reagent("blackpepper",10)
if("cream")
if(check_container_volume(10)) return 0
else if (check_cost(30/efficiency)) return 0
if(check_container_volume(10))
return 0
else if (check_cost(30/efficiency))
return 0
else beaker.reagents.add_reagent("cream",10)
if("cmilk")
if (check_cost(100/efficiency)) return 0
if (check_cost(100/efficiency))
return 0
else new/obj/item/weapon/reagent_containers/food/condiment/milk(src.loc)
if("mpepper")
if (check_cost(50/efficiency))
return 0
else new/obj/item/weapon/reagent_containers/food/condiment/peppermill(src.loc)
if("ccream")
if (check_cost(300/efficiency)) return 0
if (check_cost(300/efficiency))
return 0
else new/obj/item/weapon/reagent_containers/food/drinks/bottle/cream(src.loc)
if("meat")
if (check_cost(250/efficiency)) return 0
if (check_cost(250/efficiency))
return 0
else new/obj/item/weapon/reagent_containers/food/snacks/monkeycube(src.loc)
if("ez")
if (check_cost(10/efficiency)) return 0
if (check_cost(10/efficiency))
return 0
else new/obj/item/weapon/reagent_containers/glass/bottle/nutrient/ez(src.loc)
if("l4z")
if (check_cost(20/efficiency)) return 0
if (check_cost(20/efficiency))
return 0
else new/obj/item/weapon/reagent_containers/glass/bottle/nutrient/l4z(src.loc)
if("rh")
if (check_cost(25/efficiency)) return 0
if (check_cost(25/efficiency))
return 0
else new/obj/item/weapon/reagent_containers/glass/bottle/nutrient/rh(src.loc)
if("wk")
if (check_cost(50/efficiency)) return 0
else new/obj/item/weapon/reagent_containers/glass/bottle/weedkiller(src.loc)
if (check_cost(50/efficiency))
return 0
else new/obj/item/weapon/reagent_containers/glass/bottle/killer/weedkiller(src.loc)
if("pk")
if (check_cost(50/efficiency)) return 0
else new/obj/item/weapon/reagent_containers/glass/bottle/pestkiller(src.loc)
if (check_cost(50/efficiency))
return 0
else new/obj/item/weapon/reagent_containers/glass/bottle/killer/pestkiller(src.loc)
if("empty")
if (check_cost(5/efficiency))
return 0
else new/obj/item/weapon/reagent_containers/glass/bottle/nutrient/empty(src.loc)
if("wallet")
if (check_cost(100/efficiency)) return 0
if (check_cost(100/efficiency))
return 0
else new/obj/item/weapon/storage/wallet(src.loc)
if("bkbag")
if (check_cost(200/efficiency)) return 0
if (check_cost(200/efficiency))
return 0
else new/obj/item/weapon/storage/bag/books(src.loc)
if("ptbag")
if("sdbag")
if (check_cost(200/efficiency)) return 0
else new/obj/item/weapon/emptysandbag(src.loc)
if("ptbag")
if (check_cost(200/efficiency))
return 0
else new/obj/item/weapon/storage/bag/plants(src.loc)
if("mnbag")
if (check_cost(200/efficiency)) return 0
if (check_cost(200/efficiency))
return 0
else new/obj/item/weapon/storage/bag/ore(src.loc)
if("chbag")
if (check_cost(200/efficiency)) return 0
if (check_cost(200/efficiency))
return 0
else new/obj/item/weapon/storage/bag/chemistry(src.loc)
if("rag")
if (check_cost(200/efficiency)) return 0
if (check_cost(200/efficiency))
return 0
else new/obj/item/weapon/reagent_containers/glass/rag(src.loc)
if("gloves")
if (check_cost(250/efficiency)) return 0
if (check_cost(250/efficiency))
return 0
else new/obj/item/clothing/gloves/botanic_leather(src.loc)
if("tbelt")
if (check_cost(300/efficiency)) return 0
if (check_cost(300/efficiency))
return 0
else new/obj/item/weapon/storage/belt/utility(src.loc)
if("sbelt")
if (check_cost(300/efficiency)) return 0
if (check_cost(300/efficiency))
return 0
else new/obj/item/weapon/storage/belt/security(src.loc)
if("mbelt")
if (check_cost(300/efficiency)) return 0
if (check_cost(300/efficiency))
return 0
else new/obj/item/weapon/storage/belt/medical(src.loc)
if("jbelt")
if (check_cost(300/efficiency)) return 0
if (check_cost(300/efficiency))
return 0
else new/obj/item/weapon/storage/belt/janitor(src.loc)
if("bbelt")
if (check_cost(300/efficiency)) return 0
if (check_cost(300/efficiency))
return 0
else new/obj/item/weapon/storage/belt/bandolier(src.loc)
if("sholster")
if (check_cost(400/efficiency)) return 0
if (check_cost(400/efficiency))
return 0
else new/obj/item/weapon/storage/belt/holster(src.loc)
if("satchel")
if (check_cost(400/efficiency)) return 0
if (check_cost(400/efficiency))
return 0
else new/obj/item/weapon/storage/backpack/satchel(src.loc)
if("jacket")
if (check_cost(500/efficiency)) return 0
if (check_cost(500/efficiency))
return 0
else new/obj/item/clothing/suit/jacket/leather(src.loc)
if("overcoat")
if (check_cost(1000/efficiency)) return 0
if (check_cost(1000/efficiency))
return 0
else new/obj/item/clothing/suit/jacket/leather/overcoat(src.loc)
if("rice_hat")
if (check_cost(300/efficiency)) return 0
if (check_cost(300/efficiency))
return 0
else new/obj/item/clothing/head/rice_hat(src.loc)
processing = 0
menustat = "complete"
@@ -15,7 +15,7 @@
icon_grow = "grass-grow"
icon_dead = "grass-dead"
mutatelist = list(/obj/item/seeds/grass/carpet)
reagents_add = list("nutriment" = 0.02)
reagents_add = list("nutriment" = 0.02, "hydrogen" = 0.05)
/obj/item/weapon/reagent_containers/food/snacks/grown/grass
seed = /obj/item/seeds/grass
@@ -78,4 +78,4 @@
CA.attackby(CT, user) //we try to transfer all old unfinished stacks to the new stack we created.
carpetAmt -= CT.max_amount
qdel(src)
return
return
+24 -4
View File
@@ -137,6 +137,7 @@
/obj/item/weapon/reagent_containers/glass/bottle/nutrient/ez
name = "bottle of E-Z-Nutrient"
desc = "Contains a fertilizer that causes mild mutations with each harvest."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle16"
@@ -146,6 +147,7 @@
/obj/item/weapon/reagent_containers/glass/bottle/nutrient/l4z
name = "bottle of Left 4 Zed"
desc = "Contains a fertilizer that limits plant yields to no more than one and causes significant mutations in plants."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle18"
@@ -155,6 +157,7 @@
/obj/item/weapon/reagent_containers/glass/bottle/nutrient/rh
name = "bottle of Robust Harvest"
desc = "Contains a fertilizer that doubles the yield of a plant while causing no mutations."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle15"
@@ -162,20 +165,37 @@
..()
reagents.add_reagent("robustharvestnutriment", 50)
/obj/item/weapon/reagent_containers/glass/bottle/weedkiller
/obj/item/weapon/reagent_containers/glass/bottle/nutrient/empty
name = "bottle"
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle16"
/obj/item/weapon/reagent_containers/glass/bottle/killer
name = "bottle"
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle16"
volume = 50
w_class = 1
amount_per_transfer_from_this = 10
possible_transfer_amounts = list(1,2,5,10,15,25,50)
/obj/item/weapon/reagent_containers/glass/bottle/killer/weedkiller
name = "bottle of weed killer"
desc = "Contains a herbicide."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle19"
/obj/item/weapon/reagent_containers/glass/bottle/weedkiller/New()
/obj/item/weapon/reagent_containers/glass/bottle/killer/weedkiller/New()
..()
reagents.add_reagent("weedkiller", 50)
/obj/item/weapon/reagent_containers/glass/bottle/pestkiller
/obj/item/weapon/reagent_containers/glass/bottle/killer/pestkiller
name = "bottle of pest spray"
desc = "Contains a pesticide."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle20"
/obj/item/weapon/reagent_containers/glass/bottle/pestkiller/New()
/obj/item/weapon/reagent_containers/glass/bottle/killer/pestkiller/New()
..()
reagents.add_reagent("pestkiller", 50)
+14 -4
View File
@@ -78,15 +78,19 @@ Shaft Miner
belt = /obj/item/device/pda/shaftminer
ears = /obj/item/device/radio/headset/headset_cargo
uniform = /obj/item/clothing/under/rank/miner
shoes = /obj/item/clothing/shoes/jackboots
gloves = /obj/item/clothing/gloves/color/black
uniform = /obj/item/clothing/under/rank/miner/lavaland
l_pocket = /obj/item/weapon/reagent_containers/pill/patch/styptic
backpack_contents = list(/obj/item/weapon/crowbar=1,\
/obj/item/weapon/storage/bag/ore=1,\
/obj/item/device/flashlight/seclite=1,\
/obj/item/weapon/kitchen/knife/combat/survival=1,\
/obj/item/weapon/mining_voucher=1)
backpack = /obj/item/weapon/storage/backpack/industrial
satchel = /obj/item/weapon/storage/backpack/satchel_eng
dufflebag = /obj/item/weapon/storage/backpack/dufflebag/engineering
backpack = /obj/item/weapon/storage/backpack/security
satchel = /obj/item/weapon/storage/backpack/satchel_sec
dufflebag = /obj/item/weapon/storage/backpack/dufflebag/sec
box = /obj/item/weapon/storage/box/engineer
/*
@@ -158,6 +162,12 @@ Cook
suit = /obj/item/clothing/suit/apron/chef
head = /obj/item/clothing/head/soft/mime
/datum/outfit/job/cook/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
..()
var/list/possible_boxes = subtypesof(/obj/item/weapon/storage/box/ingredients)
var/chosen_box = pick(possible_boxes)
var/obj/item/weapon/storage/box/I = new chosen_box(src)
H.equip_to_slot_or_del(I,slot_in_backpack)
/*
Botanist
+181 -44
View File
@@ -277,30 +277,35 @@
anchored = 1
var/obj/item/weapon/card/id/inserted_id
var/list/prize_list = list(
new /datum/data/mining_equipment("Stimpack", /obj/item/weapon/reagent_containers/hypospray/medipen/stimpack, 50),
new /datum/data/mining_equipment("Stimpack Bundle", /obj/item/weapon/storage/box/medipens/utility, 200),
new /datum/data/mining_equipment("Whiskey", /obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey, 100),
new /datum/data/mining_equipment("Cigar", /obj/item/clothing/mask/cigarette/cigar/havana, 150),
new /datum/data/mining_equipment("Soap", /obj/item/weapon/soap/nanotrasen, 200),
new /datum/data/mining_equipment("Laser Pointer", /obj/item/device/laser_pointer, 300),
new /datum/data/mining_equipment("Alien Toy", /obj/item/clothing/mask/facehugger/toy, 300),
new /datum/data/mining_equipment("Advanced Scanner", /obj/item/device/t_scanner/adv_mining_scanner, 400),
new /datum/data/mining_equipment("Hivelord Stabilizer", /obj/item/weapon/hivelordstabilizer , 400),
new /datum/data/mining_equipment("Shelter Capsule", /obj/item/weapon/survivalcapsule , 400),
new /datum/data/mining_equipment("Mining Drone", /mob/living/simple_animal/hostile/mining_drone, 500),
new /datum/data/mining_equipment("GAR mesons", /obj/item/clothing/glasses/meson/gar, 500),
new /datum/data/mining_equipment("Brute First-Aid Kit", /obj/item/weapon/storage/firstaid/brute, 600),
new /datum/data/mining_equipment("Jaunter", /obj/item/device/wormhole_jaunter, 600),
new /datum/data/mining_equipment("Kinetic Accelerator", /obj/item/weapon/gun/energy/kinetic_accelerator, 750),
new /datum/data/mining_equipment("Resonator", /obj/item/weapon/resonator, 800),
new /datum/data/mining_equipment("Lazarus Injector", /obj/item/weapon/lazarus_injector, 1000),
new /datum/data/mining_equipment("Silver Pickaxe", /obj/item/weapon/pickaxe/silver, 1000),
new /datum/data/mining_equipment("Jetpack Upgrade", /obj/item/hardsuit_jetpack , 2000),
new /datum/data/mining_equipment("Space Cash", /obj/item/stack/spacecash/c1000, 2000),
new /datum/data/mining_equipment("Diamond Pickaxe", /obj/item/weapon/pickaxe/diamond, 2000),
new /datum/data/mining_equipment("Super Resonator", /obj/item/weapon/resonator/upgraded, 2500),
new /datum/data/mining_equipment("Super Accelerator", /obj/item/weapon/gun/energy/kinetic_accelerator/super, 3000),
new /datum/data/mining_equipment("Point Transfer Card", /obj/item/weapon/card/mining_point_card, 500),
new /datum/data/mining_equipment("Stimpack", /obj/item/weapon/reagent_containers/hypospray/medipen/stimpack, 50),
new /datum/data/mining_equipment("Stimpack Bundle", /obj/item/weapon/storage/box/medipens/utility, 200),
new /datum/data/mining_equipment("Whiskey", /obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey, 100),
new /datum/data/mining_equipment("Absinthe", /obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe/premium,100),
new /datum/data/mining_equipment("Cigar", /obj/item/clothing/mask/cigarette/cigar/havana, 150),
new /datum/data/mining_equipment("Soap", /obj/item/weapon/soap/nanotrasen, 200),
new /datum/data/mining_equipment("Laser Pointer", /obj/item/device/laser_pointer, 300),
new /datum/data/mining_equipment("Alien Toy", /obj/item/clothing/mask/facehugger/toy, 300),
new /datum/data/mining_equipment("Advanced Scanner", /obj/item/device/t_scanner/adv_mining_scanner, 800),
new /datum/data/mining_equipment("Hivelord Stabilizer", /obj/item/weapon/hivelordstabilizer , 400),
new /datum/data/mining_equipment("Shelter Capsule", /obj/item/weapon/survivalcapsule , 400),
new /datum/data/mining_equipment("GAR scanners", /obj/item/clothing/glasses/meson/gar, 500),
new /datum/data/mining_equipment("Brute First-Aid Kit", /obj/item/weapon/storage/firstaid/brute, 600),
new /datum/data/mining_equipment("Jaunter", /obj/item/device/wormhole_jaunter, 600),
new /datum/data/mining_equipment("Kinetic Accelerator", /obj/item/weapon/gun/energy/kinetic_accelerator, 750),
new /datum/data/mining_equipment("Resonator", /obj/item/weapon/resonator, 800),
new /datum/data/mining_equipment("Lazarus Injector", /obj/item/weapon/lazarus_injector, 1000),
new /datum/data/mining_equipment("Silver Pickaxe", /obj/item/weapon/pickaxe/silver, 1000),
new /datum/data/mining_equipment("Jetpack Upgrade", /obj/item/hardsuit_jetpack , 2000),
new /datum/data/mining_equipment("Space Cash", /obj/item/stack/spacecash/c1000, 2000),
new /datum/data/mining_equipment("Diamond Pickaxe", /obj/item/weapon/pickaxe/diamond, 2000),
new /datum/data/mining_equipment("Super Resonator", /obj/item/weapon/resonator/upgraded, 2500),
new /datum/data/mining_equipment("Super Accelerator", /obj/item/weapon/gun/energy/kinetic_accelerator/super, 3000),
new /datum/data/mining_equipment("Point Transfer Card", /obj/item/weapon/card/mining_point_card, 500),
new /datum/data/mining_equipment("Mining Drone", /mob/living/simple_animal/hostile/mining_drone, 800),
new /datum/data/mining_equipment("Drone Melee Upgrade", /obj/item/device/mine_bot_ugprade, 400),
new /datum/data/mining_equipment("Drone Health Upgrade",/obj/item/device/mine_bot_ugprade/health, 400),
new /datum/data/mining_equipment("Drone Ranged Upgrade",/obj/item/device/mine_bot_ugprade/cooldown, 600),
new /datum/data/mining_equipment("Drone AI Upgrade", /obj/item/slimepotion/sentience/mining, 1000),
)
/datum/data/mining_equipment/
@@ -409,12 +414,13 @@
..()
/obj/machinery/mineral/equipment_vendor/proc/RedeemVoucher(obj/item/weapon/mining_voucher/voucher, mob/redeemer)
var/selection = input(redeemer, "Pick your equipment", "Mining Voucher Redemption") as null|anything in list("Kinetic Accelerator", "Resonator", "Mining Drone", "Advanced Scanner")
var/selection = input(redeemer, "Pick your equipment", "Mining Voucher Redemption") as null|anything in list("Two Survival Capsules", "Resonator", "Mining Drone", "Advanced Scanner")
if(!selection || !Adjacent(redeemer) || qdeleted(voucher) || voucher.loc != redeemer)
return
switch(selection)
if("Kinetic Accelerator")
new /obj/item/weapon/gun/energy/kinetic_accelerator(src.loc)
if("Two Survival Capsules")
new /obj/item/weapon/survivalcapsule(src.loc)
new /obj/item/weapon/survivalcapsule(src.loc)
if("Resonator")
new /obj/item/weapon/resonator(src.loc)
if("Mining Drone")
@@ -530,12 +536,12 @@
item_state = "resonator"
desc = "A handheld device that creates small fields of energy that resonate until they detonate, crushing rock. It can also be activated without a target to create a field at the user's location, to act as a delayed time trap. It's more effective in a vacuum."
w_class = 3
force = 8
force = 15
throwforce = 10
var/cooldown = 0
var/fieldsactive = 0
var/burst_time = 50
var/fieldlimit = 3
var/burst_time = 30
var/fieldlimit = 4
origin_tech = "magnets=2;combat=2"
/obj/item/weapon/resonator/upgraded
@@ -544,7 +550,7 @@
icon_state = "resonator_u"
item_state = "resonator_u"
origin_tech = "magnets=3;combat=3"
fieldlimit = 5
fieldlimit = 6
/obj/item/weapon/resonator/proc/CreateResonance(target, creator)
var/turf/T = get_turf(target)
@@ -594,7 +600,7 @@
var/pressure = environment.return_pressure()
if(pressure < 50)
name = "strong resonance field"
resonance_damage = 50
resonance_damage = 60
spawn(timetoburst)
playsound(src,'sound/weapons/resonator_blast.ogg',50,1)
if(creator)
@@ -646,9 +652,11 @@
melee_damage_lower = 15
melee_damage_upper = 15
environment_smash = 0
check_friendly_fire = 1
attacktext = "drills"
attack_sound = 'sound/weapons/circsawhit.ogg'
ranged = 1
sentience_type = SENTIENCE_MINEBOT
ranged_message = "shoots"
ranged_cooldown_cap = 3
projectiletype = /obj/item/projectile/kinetic
@@ -749,6 +757,65 @@
SetOffenseBehavior()
. = ..()
/**********************Minebot Upgrades**********************/
//Melee
/obj/item/device/mine_bot_ugprade
name = "minebot melee upgrade"
desc = "A minebot upgrade."
icon_state = "door_electronics"
icon = 'icons/obj/module.dmi'
/obj/item/device/mine_bot_ugprade/afterattack(mob/living/simple_animal/hostile/mining_drone/M, mob/user)
if(!istype(M))
return
upgrade_bot(M, user)
/obj/item/device/mine_bot_ugprade/proc/upgrade_bot(mob/living/simple_animal/hostile/mining_drone/M, mob/user)
if(M.melee_damage_upper != initial(M.melee_damage_upper))
user << "[src] already has a combat upgrade installed!"
return
M.melee_damage_lower = 22
M.melee_damage_upper = 22
qdel(src)
//Health
/obj/item/device/mine_bot_ugprade/health
name = "minebot chassis upgrade"
/obj/item/device/mine_bot_ugprade/health/upgrade_bot(mob/living/simple_animal/hostile/mining_drone/M, mob/user)
if(M.maxHealth != initial(M.maxHealth))
user << "[src] already has a reinforced chassis!"
return
M.maxHealth = 170
qdel(src)
//Cooldown
/obj/item/device/mine_bot_ugprade/cooldown
name = "minebot cooldown upgrade"
/obj/item/device/mine_bot_ugprade/cooldown/upgrade_bot(mob/living/simple_animal/hostile/mining_drone/M, mob/user)
name = "minebot cooldown upgrade"
if(M.ranged_cooldown_cap != initial(M.ranged_cooldown_cap))
user << "[src] already has a decreased weapon cooldown!"
return
M.ranged_cooldown_cap = 1
qdel(src)
//AI
/obj/item/slimepotion/sentience/mining
name = "minebot AI upgrade"
desc = "Can be used to grant sentience to minebots."
icon_state = "door_electronics"
icon = 'icons/obj/module.dmi'
sentience_type = SENTIENCE_MINEBOT
/**********************Lazarus Injector**********************/
/obj/item/weapon/lazarus_injector
@@ -810,8 +877,8 @@
/**********************Mining Scanners**********************/
/obj/item/device/mining_scanner
desc = "A scanner that checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. Requires you to wear mesons to function properly."
name = "mining scanner"
desc = "A scanner that checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. Wear material scanners for optimal results."
name = "manual mining scanner"
icon_state = "mining1"
item_state = "analyzer"
w_class = 2
@@ -842,27 +909,48 @@
qdel(src)
/obj/item/device/t_scanner/adv_mining_scanner
desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. Requires you to wear mesons to function properly."
name = "advanced mining scanner"
desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. Wear meson scanners for optimal results. This one has an extended range."
name = "advanced automatic mining scanner"
icon_state = "mining0"
item_state = "analyzer"
w_class = 2
flags = CONDUCT
slot_flags = SLOT_BELT
var/cooldown = 0
var/cooldown = 35
var/on_cooldown = 0
var/range = 7
var/meson = TRUE
origin_tech = "engineering=3;magnets=3"
/obj/item/device/t_scanner/adv_mining_scanner/material
meson = FALSE
desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. Wear material scanners for optimal results. This one has an extended range."
/obj/item/device/t_scanner/adv_mining_scanner/lesser
name = "automatic mining scanner"
desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. Wear meson scanners for optimal results."
range = 4
cooldown = 50
/obj/item/device/t_scanner/adv_mining_scanner/lesser/material
desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. Wear material scanners for optimal results."
meson = FALSE
/obj/item/device/t_scanner/adv_mining_scanner/scan()
if(!cooldown)
cooldown = 1
spawn(35)
cooldown = 0
if(!on_cooldown)
on_cooldown = 1
spawn(cooldown)
on_cooldown = 0
var/turf/t = get_turf(src)
var/list/mobs = recursive_mob_check(t, 1,0,0)
if(!mobs.len)
return
mineral_scan_pulse(mobs, t)
if(meson)
mineral_scan_pulse(mobs, t, range)
else
mineral_scan_pulse_material(mobs, t, range)
//For use with mesons
/proc/mineral_scan_pulse(list/mobs, turf/T, range = world.view)
var/list/minerals = list()
for(var/turf/closed/mineral/M in range(range, T))
@@ -874,12 +962,33 @@
var/client/C = user.client
for(var/turf/closed/mineral/M in minerals)
var/turf/F = get_turf(M)
var/image/I = image('icons/turf/smoothrocks.dmi', loc = F, icon_state = M.scan_state, layer = 18)
var/image/I = image('icons/turf/mining.dmi', loc = F, icon_state = M.scan_state, layer = 18)
C.images += I
spawn(30)
if(C)
C.images -= I
//For use with material scanners
/proc/mineral_scan_pulse_material(list/mobs, turf/T, range = world.view)
var/list/minerals = list()
for(var/turf/simulated/mineral/M in range(range, T))
if(M.scan_state)
minerals += M
if(minerals.len)
for(var/turf/simulated/mineral/M in minerals)
var/obj/effect/overlay/temp/mining_overlay/C = PoolOrNew(/obj/effect/overlay/temp/mining_overlay, M)
C.icon_state = M.scan_state
/obj/effect/overlay/temp/mining_overlay
layer = 20
icon = 'icons/turf/smoothrocks.dmi'
anchored = 1
mouse_opacity = 0
duration = 30
pixel_x = -4
pixel_y = -4
/**********************Xeno Warning Sign**********************/
/obj/structure/sign/xeno_warning_mining
name = "DANGEROUS ALIEN LIFE"
@@ -924,4 +1033,32 @@
return ..()
C.preserved = 1
user << "<span class='notice'>You inject the hivelord core with the stabilizer. It will no longer go inert.</span>"
qdel(src)
qdel(src)
/****************Explorer's Suit**************************/
/obj/item/clothing/suit/hooded/explorer
name = "explorer suit"
desc = "An armoured suit for exploring harsh environments."
icon_state = "explorer"
item_state = "explorer"
body_parts_covered = CHEST|GROIN|LEGS|ARMS
hooded = 1
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
hoodtype = /obj/item/clothing/head/explorer
armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 50, bio = 100, rad = 50)
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals, /obj/item/weapon/resonator, /obj/item/device/mining_scanner, /obj/item/device/t_scanner/adv_mining_scanner, /obj/item/weapon/gun/energy/kinetic_accelerator)
/obj/item/clothing/head/explorer
name = "explorer hood"
desc = "An armoured hood for exploring harsh environments."
icon_state = "explorer"
body_parts_covered = HEAD
flags = NODROP
flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS
min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT
armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 50, bio = 100, rad = 50)
@@ -87,6 +87,8 @@
/datum/weather/ash_storm/storm_act(mob/living/L)
if("mining" in L.faction)
return
if(istype(L.loc, /obj/mecha))
return
if(ishuman(L))
var/mob/living/carbon/human/H = L
var/thermal_protection = H.get_thermal_protection()
+6 -1
View File
@@ -37,10 +37,11 @@
/obj/structure/closet/secure_closet/miner/New()
..()
new /obj/item/device/radio/headset/headset_cargo(src)
new /obj/item/device/mining_scanner(src)
new /obj/item/device/t_scanner/adv_mining_scanner/lesser(src)
new /obj/item/weapon/storage/bag/ore(src)
new /obj/item/weapon/shovel(src)
new /obj/item/weapon/pickaxe(src)
new /obj/item/weapon/gun/energy/kinetic_accelerator(src)
new /obj/item/clothing/glasses/meson(src)
new /obj/item/weapon/survivalcapsule(src)
@@ -198,6 +199,10 @@
return
playsound(get_turf(src), 'sound/effects/phasein.ogg', 100, 1)
PoolOrNew(/obj/effect/particle_effect/smoke, src.loc)
var/turf/T = get_turf(src)
if(T.z != ZLEVEL_MINING && T.z != ZLEVEL_LAVALAND)//only report capsules away from the mining/lavaland level
message_admins("[key_name_admin(usr)] (<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A>) (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[usr]'>FLW</A>) activated a bluespace capsule away from the mining level! (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>JMP</a>)")
log_admin("[key_name(usr)] activated a bluespace capsule away from the mining level at [T.x], [T.y], [T.z]")
load()
qdel(src)
+7 -8
View File
@@ -111,13 +111,12 @@
usr << "<span class='warning'>Your other hand is too busy holding the [item_in_hand.name]</span>"
return
src.hand = !( src.hand )
if(hud_used.l_hand_hud_object && hud_used.r_hand_hud_object)
if(hand) //This being 1 means the left hand is in use
hud_used.l_hand_hud_object.icon_state = "hand_l_active"
hud_used.r_hand_hud_object.icon_state = "hand_r_inactive"
else
hud_used.l_hand_hud_object.icon_state = "hand_l_inactive"
hud_used.r_hand_hud_object.icon_state = "hand_r_active"
if(hud_used && hud_used.inv_slots[slot_l_hand] && hud_used.inv_slots[slot_r_hand])
var/obj/screen/inventory/hand/H
H = hud_used.inv_slots[slot_l_hand]
H.update_icon()
H = hud_used.inv_slots[slot_r_hand]
H.update_icon()
/*if (!( src.hand ))
src.hands.dir = NORTH
else
@@ -170,7 +169,7 @@
return
if(weakeyes)
Stun(2)
if (damage == 1)
src << "<span class='warning'>Your eyes sting a little.</span>"
if(prob(40))
@@ -155,6 +155,10 @@ Please contact me on #coderbus IRC. ~Carnie x
/mob/living/carbon/human/update_inv_w_uniform()
remove_overlay(UNIFORM_LAYER)
if(client && hud_used)
var/obj/screen/inventory/inv = hud_used.inv_slots[slot_w_uniform]
inv.update_icon()
if(istype(w_uniform, /obj/item/clothing/under))
var/obj/item/clothing/under/U = w_uniform
if(client && hud_used && hud_used.hud_shown)
@@ -192,6 +196,11 @@ Please contact me on #coderbus IRC. ~Carnie x
/mob/living/carbon/human/update_inv_wear_id()
remove_overlay(ID_LAYER)
if(client && hud_used)
var/obj/screen/inventory/inv = hud_used.inv_slots[slot_wear_id]
inv.update_icon()
if(wear_id)
if(client && hud_used && hud_used.hud_shown)
wear_id.screen_loc = ui_id
@@ -206,6 +215,11 @@ Please contact me on #coderbus IRC. ~Carnie x
/mob/living/carbon/human/update_inv_gloves()
remove_overlay(GLOVES_LAYER)
if(client && hud_used)
var/obj/screen/inventory/inv = hud_used.inv_slots[slot_gloves]
inv.update_icon()
if(gloves)
if(client && hud_used && hud_used.hud_shown)
if(hud_used.inventory_shown) //if the inventory is open ...
@@ -231,6 +245,10 @@ Please contact me on #coderbus IRC. ~Carnie x
/mob/living/carbon/human/update_inv_glasses()
remove_overlay(GLASSES_LAYER)
if(client && hud_used)
var/obj/screen/inventory/inv = hud_used.inv_slots[slot_glasses]
inv.update_icon()
if(glasses)
if(client && hud_used && hud_used.hud_shown)
if(hud_used.inventory_shown) //if the inventory is open ...
@@ -248,6 +266,10 @@ Please contact me on #coderbus IRC. ~Carnie x
/mob/living/carbon/human/update_inv_ears()
remove_overlay(EARS_LAYER)
if(client && hud_used)
var/obj/screen/inventory/inv = hud_used.inv_slots[slot_ears]
inv.update_icon()
if(ears)
if(client && hud_used && hud_used.hud_shown)
if(hud_used.inventory_shown) //if the inventory is open ...
@@ -263,6 +285,10 @@ Please contact me on #coderbus IRC. ~Carnie x
/mob/living/carbon/human/update_inv_shoes()
remove_overlay(SHOES_LAYER)
if(client && hud_used)
var/obj/screen/inventory/inv = hud_used.inv_slots[slot_shoes]
inv.update_icon()
if(shoes)
if(client && hud_used && hud_used.hud_shown)
if(hud_used.inventory_shown) //if the inventory is open ...
@@ -278,6 +304,10 @@ Please contact me on #coderbus IRC. ~Carnie x
/mob/living/carbon/human/update_inv_s_store()
remove_overlay(SUIT_STORE_LAYER)
if(client && hud_used)
var/obj/screen/inventory/inv = hud_used.inv_slots[slot_s_store]
inv.update_icon()
if(s_store)
if(client && hud_used && hud_used.hud_shown)
s_store.screen_loc = ui_sstore1
@@ -294,17 +324,25 @@ Please contact me on #coderbus IRC. ~Carnie x
/mob/living/carbon/human/update_inv_head()
..()
if(client && hud_used)
var/obj/screen/inventory/inv = hud_used.inv_slots[slot_head]
inv.update_icon()
update_mutant_bodyparts()
/mob/living/carbon/human/update_inv_belt()
remove_overlay(BELT_LAYER)
if(belt)
if(client && hud_used && hud_used.hud_shown)
if(client && hud_used)
var/obj/screen/inventory/inv = hud_used.inv_slots[slot_belt]
inv.update_icon()
if(hud_used.hud_shown && belt)
client.screen += belt
belt.screen_loc = ui_belt
if(belt)
var/t_state = belt.item_state
if(!t_state)
t_state = belt.icon_state
@@ -320,6 +358,10 @@ Please contact me on #coderbus IRC. ~Carnie x
/mob/living/carbon/human/update_inv_wear_suit()
remove_overlay(SUIT_LAYER)
if(client && hud_used)
var/obj/screen/inventory/inv = hud_used.inv_slots[slot_wear_suit]
inv.update_icon()
if(istype(wear_suit, /obj/item/clothing/suit))
if(client && hud_used && hud_used.hud_shown)
if(hud_used.inventory_shown) //if the inventory is open ...
@@ -340,19 +382,30 @@ Please contact me on #coderbus IRC. ~Carnie x
/mob/living/carbon/human/update_inv_pockets()
if(l_store)
if(client && hud_used && hud_used.hud_shown)
client.screen += l_store
l_store.screen_loc = ui_storage1
if(r_store)
if(client && hud_used && hud_used.hud_shown)
client.screen += r_store
r_store.screen_loc = ui_storage2
if(client && hud_used)
var/obj/screen/inventory/inv
inv = hud_used.inv_slots[slot_l_store]
inv.update_icon()
inv = hud_used.inv_slots[slot_r_store]
inv.update_icon()
if(hud_used.hud_shown)
if(l_store)
client.screen += l_store
l_store.screen_loc = ui_storage1
if(r_store)
client.screen += r_store
r_store.screen_loc = ui_storage2
/mob/living/carbon/human/update_inv_wear_mask()
..()
if(client && hud_used)
var/obj/screen/inventory/inv = hud_used.inv_slots[slot_wear_mask]
inv.update_icon()
update_mutant_bodyparts()
/mob/living/carbon/human/update_inv_handcuffed()
@@ -105,6 +105,11 @@
/mob/living/carbon/update_inv_back()
remove_overlay(BACK_LAYER)
if(client && hud_used && hud_used.inv_slots[slot_back])
var/obj/screen/inventory/inv = hud_used.inv_slots[slot_back]
inv.update_icon()
if(back)
var/image/standing = back.build_worn_icon(state = back.icon_state, default_layer = BACK_LAYER, default_icon_file = 'icons/mob/back.dmi')
overlays_standing[BACK_LAYER] = standing
@@ -128,15 +133,11 @@
//update whether handcuffs appears on our hud.
/mob/living/carbon/proc/update_hud_handcuffed()
if(hud_used)
var/obj/screen/inventory/R = hud_used.r_hand_hud_object
var/obj/screen/inventory/L = hud_used.l_hand_hud_object
var/obj/screen/inventory/R = hud_used.inv_slots[slot_r_hand]
var/obj/screen/inventory/L = hud_used.inv_slots[slot_l_hand]
if(R && L)
if(handcuffed) //hud handcuff icons
R.overlays += image("icon"='icons/mob/screen_gen.dmi', "icon_state"="markus")
L.overlays += image("icon"='icons/mob/screen_gen.dmi', "icon_state"="gabrielle")
else
R.overlays = null
L.overlays = null
R.update_icon()
L.update_icon()
//update whether our head item appears on our hud.
/mob/living/carbon/proc/update_hud_head(obj/item/I)
@@ -1217,6 +1217,11 @@
see_invisible = min(see_invisible, SEE_INVISIBLE_MINIMUM)
see_in_dark = 1
if(sight_mode & BORGMATERIAL)
sight |= SEE_OBJS
see_invisible = min(see_invisible, SEE_INVISIBLE_MINIMUM)
see_in_dark = 1
if(sight_mode & BORGXRAY)
sight |= (SEE_TURFS|SEE_MOBS|SEE_OBJS)
see_invisible = SEE_INVISIBLE_LIVING
@@ -34,13 +34,12 @@
return
hand = !hand
if(hud_used.l_hand_hud_object && hud_used.r_hand_hud_object)
if(hand)
hud_used.l_hand_hud_object.icon_state = "hand_l_active"
hud_used.r_hand_hud_object.icon_state = "hand_r_inactive"
else
hud_used.l_hand_hud_object.icon_state = "hand_l_inactive"
hud_used.r_hand_hud_object.icon_state = "hand_r_active"
if(hud_used && hud_used.inv_slots[slot_l_hand] && hud_used.inv_slots[slot_r_hand])
var/obj/screen/inventory/hand/H
H = hud_used.inv_slots[slot_l_hand]
H.update_icon()
H = hud_used.inv_slots[slot_r_hand]
H.update_icon()
/mob/living/simple_animal/drone/unEquip(obj/item/I, force)
@@ -354,7 +354,7 @@ var/global/list/parasites = list() //all currently existing/living guardians
/obj/item/weapon/guardiancreator/attack_self(mob/living/user)
var/list/guardians = user.hasparasites()
if(guardians.len && !allowmultiple)
user << "You already have a [mob_name]!"
user << "<span class='holoparasite'>You already have a [mob_name]!</span>"
return
if(user.mind && user.mind.changeling && !allowling)
user << "[ling_failure]"
@@ -415,6 +415,11 @@ var/global/list/parasites = list() //all currently existing/living guardians
if("Assassin")
pickedtype = /mob/living/simple_animal/hostile/guardian/assassin
var/list/guardians = user.hasparasites()
if(guardians.len && !allowmultiple)
user << "<span class='holoparasite'>You already have a [mob_name]!</span>" //nice try, bucko
used = FALSE
return
var/mob/living/simple_animal/hostile/guardian/G = new pickedtype(user, theme)
G.summoner = user
G.key = key
@@ -60,12 +60,12 @@
/datum/guardianname/tech/daisy
suffixcolour = "Daisy"
parasiteicon = "techDaisy"
colour = "#F6F446"
colour = "#ECCD39"
/datum/guardianname/tech/zinnia
suffixcolour = "Zinnia"
parasiteicon = "techZinnia"
colour = "#BFF62C"
colour = "#89F62C"
/datum/guardianname/tech/ivy
suffixcolour = "Ivy"
@@ -452,11 +452,11 @@
/obj/item/asteroid/goliath_hide/afterattack(atom/target, mob/user, proximity_flag)
if(proximity_flag)
if(istype(target, /obj/item/clothing/suit/space/hardsuit/mining) || istype(target, /obj/item/clothing/head/helmet/space/hardsuit/mining))
if(istype(target, /obj/item/clothing/suit/space/hardsuit/mining) || istype(target, /obj/item/clothing/suit/hooded/explorer))
var/obj/item/clothing/C = target
var/list/current_armor = C.armor
if(current_armor.["melee"] < 80)
current_armor.["melee"] = min(current_armor.["melee"] + 10, 80)
if(current_armor.["melee"] < 60)
current_armor.["melee"] = min(current_armor.["melee"] + 10, 60)
user << "<span class='info'>You strengthen [target], improving its resistance against melee attacks.</span>"
qdel(src)
else
@@ -653,6 +653,7 @@
throw_message = "does nothing to the tough hide of the"
pre_attack_icon = "goliath2"
loot = list(/obj/item/asteroid/goliath_hide{layer = 4.1})
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat/slab/goliath = 2)
stat_attack = 1
robust_searching = 1
@@ -51,7 +51,7 @@
H.dna.update_dna_identity()
if(mind && istype(M, /mob/living))
mind.transfer_to(M)
mind.transfer_to(M, 1) // second argument to force key move to new mob
else
M.key = key

Some files were not shown because too many files have changed in this diff Show More