mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-12 03:02:54 +00:00
Merge branch 'master' of https://github.com/PolarisSS13/Polaris into 12/16/2015_newwizard
This commit is contained in:
@@ -5,7 +5,7 @@ sudo: false
|
||||
env:
|
||||
BYOND_MAJOR="510"
|
||||
BYOND_MINOR="1346"
|
||||
MACRO_COUNT=987
|
||||
MACRO_COUNT=986
|
||||
|
||||
cache:
|
||||
directories:
|
||||
|
||||
@@ -68,6 +68,7 @@ var/list/be_special_flags = list(
|
||||
#define MODE_COMMANDO "commando"
|
||||
#define MODE_DEATHSQUAD "deathsquad"
|
||||
#define MODE_ERT "ert"
|
||||
#define MODE_TRADE "trader"
|
||||
#define MODE_MERCENARY "mercenary"
|
||||
#define MODE_NINJA "ninja"
|
||||
#define MODE_RAIDER "raider"
|
||||
|
||||
@@ -92,7 +92,8 @@
|
||||
// Setting this much higher than 1024 could allow spammers to DOS the server easily.
|
||||
#define MAX_MESSAGE_LEN 1024
|
||||
#define MAX_PAPER_MESSAGE_LEN 6144
|
||||
#define MAX_BOOK_MESSAGE_LEN 12288
|
||||
#define MAX_BOOK_MESSAGE_LEN 24576
|
||||
#define MAX_RECORD_LENGTH 24576
|
||||
#define MAX_LNAME_LEN 64
|
||||
#define MAX_NAME_LEN 52
|
||||
|
||||
@@ -161,3 +162,8 @@
|
||||
#define CAT_NORMAL 1
|
||||
#define CAT_HIDDEN 2
|
||||
#define CAT_COIN 4
|
||||
|
||||
//Antag Faction Visbility
|
||||
#define ANTAG_HIDDEN "Hidden"
|
||||
#define ANTAG_SHARED "Shared"
|
||||
#define ANTAG_KNOWN "Known"
|
||||
|
||||
@@ -76,6 +76,7 @@ avoid code duplication. This includes items that may sometimes act as a standard
|
||||
|
||||
//Called when a weapon is used to make a successful melee attack on a mob. Returns the blocked result
|
||||
/obj/item/proc/apply_hit_effect(mob/living/target, mob/living/user, var/hit_zone)
|
||||
user.break_cloak()
|
||||
if(hitsound)
|
||||
playsound(loc, hitsound, 50, 1, -1)
|
||||
|
||||
|
||||
@@ -65,6 +65,7 @@ var/list/gamemode_cache = list()
|
||||
var/usewhitelist = 0
|
||||
var/kick_inactive = 0 //force disconnect for inactive players after this many minutes, if non-0
|
||||
var/show_mods = 0
|
||||
var/show_devs = 0
|
||||
var/show_mentors = 0
|
||||
var/mods_can_tempban = 0
|
||||
var/mods_can_job_tempban = 0
|
||||
@@ -505,6 +506,9 @@ var/list/gamemode_cache = list()
|
||||
if("show_mods")
|
||||
config.show_mods = 1
|
||||
|
||||
if("show_devs")
|
||||
config.show_devs = 1
|
||||
|
||||
if("show_mentors")
|
||||
config.show_mentors = 1
|
||||
|
||||
|
||||
@@ -223,6 +223,17 @@ var/global/datum/shuttle_controller/shuttle_controller
|
||||
shuttles["Administration"] = shuttle
|
||||
process_shuttles += shuttle
|
||||
|
||||
shuttle = new()
|
||||
shuttle.location = 1
|
||||
shuttle.warmup_time = 10 //want some warmup time so people can cancel.
|
||||
shuttle.area_offsite = locate(/area/shuttle/trade/centcom)
|
||||
shuttle.area_station = locate(/area/shuttle/trade/station)
|
||||
shuttle.docking_controller_tag = "trade_shuttle"
|
||||
shuttle.dock_target_station = "trade_shuttle_dock_airlock"
|
||||
shuttle.dock_target_offsite = "trade_shuttle_bay"
|
||||
shuttles["Trade"] = shuttle
|
||||
process_shuttles += shuttle
|
||||
|
||||
shuttle = new()
|
||||
shuttle.area_offsite = locate(/area/shuttle/alien/base)
|
||||
shuttle.area_station = locate(/area/shuttle/alien/mine)
|
||||
|
||||
@@ -228,6 +228,8 @@
|
||||
L.fields["faction"] = H.personal_faction
|
||||
L.fields["religion"] = H.religion
|
||||
L.fields["image"] = getFlatIcon(H) //This is god-awful
|
||||
L.fields["antagfac"] = H.antag_faction
|
||||
L.fields["antagvis"] = H.antag_vis
|
||||
if(H.exploit_record && !jobban_isbanned(H, "Records"))
|
||||
L.fields["exploit_record"] = H.exploit_record
|
||||
else
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
|
||||
/datum/supply_packs/atmos/canister_sleeping_agent
|
||||
name = "N2O gas canister"
|
||||
cost = 40
|
||||
cost = 15
|
||||
containername = "N2O gas canister crate"
|
||||
containertype = /obj/structure/closet/crate/secure/large
|
||||
access = access_atmospherics
|
||||
@@ -60,7 +60,7 @@
|
||||
|
||||
/datum/supply_packs/atmos/canister_carbon_dioxide
|
||||
name = "Carbon dioxide gas canister"
|
||||
cost = 40
|
||||
cost = 15
|
||||
containername = "CO2 canister crate"
|
||||
containertype = /obj/structure/closet/crate/secure/large
|
||||
access = access_atmospherics
|
||||
@@ -69,7 +69,7 @@
|
||||
/datum/supply_packs/atmos/air_dispenser
|
||||
contains = list(/obj/machinery/pipedispenser/orderable)
|
||||
name = "Pipe Dispenser"
|
||||
cost = 35
|
||||
cost = 25
|
||||
containertype = /obj/structure/closet/crate/secure/large
|
||||
containername = "Pipe Dispenser Crate"
|
||||
access = access_atmospherics
|
||||
@@ -77,7 +77,7 @@
|
||||
/datum/supply_packs/atmos/disposals_dispenser
|
||||
contains = list(/obj/machinery/pipedispenser/disposal/orderable)
|
||||
name = "Disposals Pipe Dispenser"
|
||||
cost = 35
|
||||
cost = 25
|
||||
containertype = /obj/structure/closet/crate/secure/large
|
||||
containername = "Disposal Dispenser Crate"
|
||||
access = access_atmospherics
|
||||
@@ -14,7 +14,7 @@
|
||||
)
|
||||
|
||||
name = "Contraband crate"
|
||||
cost = 30
|
||||
cost = 25
|
||||
containertype = /obj/structure/closet/crate
|
||||
containername = "Unlabeled crate"
|
||||
contraband = 1
|
||||
@@ -28,7 +28,7 @@
|
||||
/obj/item/weapon/pen/reagent/paralysis,
|
||||
/obj/item/weapon/grenade/chem_grenade/incendiary
|
||||
)
|
||||
cost = 20
|
||||
cost = 25
|
||||
containertype = /obj/structure/closet/crate
|
||||
containername = "Special Ops crate"
|
||||
hidden = 1
|
||||
|
||||
@@ -124,7 +124,7 @@ datum/supply_packs/costumes/witch
|
||||
/datum/supply_packs/randomised/costumes/costume_hats
|
||||
name = "Costume hats"
|
||||
containername = "Actor hats crate"
|
||||
containertype = /obj/structure/closet
|
||||
containertype = /obj/structure/closet/crate
|
||||
cost = 10
|
||||
num_contained = 3
|
||||
contains = list(
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
/obj/item/weapon/cell = 2,
|
||||
/obj/item/weapon/cell/high = 2
|
||||
)
|
||||
cost = 15
|
||||
cost = 10
|
||||
containertype = /obj/structure/closet/crate
|
||||
containername = "Electrical maintenance crate"
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
/datum/supply_packs/eng/fueltank
|
||||
name = "Fuel tank crate"
|
||||
contains = list(/obj/structure/reagent_dispensers/fueltank)
|
||||
cost = 8
|
||||
cost = 10
|
||||
containertype = /obj/structure/largecrate
|
||||
containername = "fuel tank crate"
|
||||
|
||||
@@ -110,7 +110,7 @@
|
||||
/datum/supply_packs/eng/shield_gen
|
||||
contains = list(/obj/item/weapon/circuitboard/shield_gen)
|
||||
name = "Bubble shield generator circuitry"
|
||||
cost = 50
|
||||
cost = 30
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "bubble shield generator circuitry crate"
|
||||
access = access_ce
|
||||
@@ -118,7 +118,7 @@
|
||||
/datum/supply_packs/eng/shield_gen_ex
|
||||
contains = list(/obj/item/weapon/circuitboard/shield_gen_ex)
|
||||
name = "Hull shield generator circuitry"
|
||||
cost = 50
|
||||
cost = 30
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "hull shield generator circuitry crate"
|
||||
access = access_ce
|
||||
@@ -126,7 +126,7 @@
|
||||
/datum/supply_packs/eng/shield_cap
|
||||
contains = list(/obj/item/weapon/circuitboard/shield_cap)
|
||||
name = "Bubble shield capacitor circuitry"
|
||||
cost = 50
|
||||
cost = 30
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "shield capacitor circuitry crate"
|
||||
access = access_ce
|
||||
@@ -142,7 +142,7 @@
|
||||
/datum/supply_packs/eng/teg
|
||||
contains = list(/obj/machinery/power/generator)
|
||||
name = "Mark I Thermoelectric Generator"
|
||||
cost = 75
|
||||
cost = 50
|
||||
containertype = /obj/structure/closet/crate/secure/large
|
||||
containername = "Mk1 TEG crate"
|
||||
access = access_engine
|
||||
@@ -150,7 +150,7 @@
|
||||
/datum/supply_packs/eng/circulator
|
||||
contains = list(/obj/machinery/atmospherics/binary/circulator)
|
||||
name = "Binary atmospheric circulator"
|
||||
cost = 60
|
||||
cost = 50
|
||||
containertype = /obj/structure/closet/crate/secure/large
|
||||
containername = "Atmospheric circulator crate"
|
||||
access = access_engine
|
||||
@@ -167,7 +167,7 @@
|
||||
|
||||
/datum/supply_packs/eng/pacman_parts
|
||||
name = "P.A.C.M.A.N. portable generator parts"
|
||||
cost = 45
|
||||
cost = 25
|
||||
containername = "P.A.C.M.A.N. Portable Generator Construction Kit"
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
access = access_tech_storage
|
||||
@@ -180,7 +180,7 @@
|
||||
|
||||
/datum/supply_packs/eng/super_pacman_parts
|
||||
name = "Super P.A.C.M.A.N. portable generator parts"
|
||||
cost = 55
|
||||
cost = 35
|
||||
containername = "Super P.A.C.M.A.N. portable generator construction kit"
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
access = access_tech_storage
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/small/ale = 2,
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer = 4,
|
||||
)
|
||||
cost = 20
|
||||
cost = 10
|
||||
containertype = /obj/structure/closet/crate
|
||||
containername = "Party equipment"
|
||||
|
||||
|
||||
@@ -17,21 +17,21 @@
|
||||
/datum/supply_packs/hydro/farwa
|
||||
name = "Farwa crate"
|
||||
contains = list (/obj/item/weapon/storage/box/monkeycubes/farwacubes)
|
||||
cost = 30
|
||||
cost = 20
|
||||
containertype = /obj/structure/closet/crate/freezer
|
||||
containername = "Farwa crate"
|
||||
|
||||
/datum/supply_packs/hydro/neara
|
||||
name = "Neaera crate"
|
||||
contains = list (/obj/item/weapon/storage/box/monkeycubes/neaeracubes)
|
||||
cost = 30
|
||||
cost = 20
|
||||
containertype = /obj/structure/closet/crate/freezer
|
||||
containername = "Neaera crate"
|
||||
|
||||
/datum/supply_packs/hydro/stok
|
||||
name = "Stok crate"
|
||||
contains = list (/obj/item/weapon/storage/box/monkeycubes/stokcubes)
|
||||
cost = 30
|
||||
cost = 20
|
||||
containertype = /obj/structure/closet/crate/freezer
|
||||
containername = "Stok crate"
|
||||
|
||||
@@ -55,14 +55,14 @@
|
||||
/obj/item/weapon/material/minihoe,
|
||||
/obj/item/weapon/storage/box/botanydisk
|
||||
)
|
||||
cost = 15
|
||||
cost = 20
|
||||
containertype = /obj/structure/closet/crate/hydroponics
|
||||
containername = "Hydroponics crate"
|
||||
access = access_hydroponics
|
||||
|
||||
/datum/supply_packs/hydro/cow
|
||||
name = "Cow crate"
|
||||
cost = 30
|
||||
cost = 25
|
||||
containertype = /obj/structure/largecrate/animal/cow
|
||||
containername = "Cow crate"
|
||||
access = access_hydroponics
|
||||
@@ -76,7 +76,7 @@
|
||||
|
||||
/datum/supply_packs/hydro/chicken
|
||||
name = "Chicken crate"
|
||||
cost = 20
|
||||
cost = 25
|
||||
containertype = /obj/structure/largecrate/animal/chick
|
||||
containername = "Chicken crate"
|
||||
access = access_hydroponics
|
||||
@@ -123,7 +123,7 @@
|
||||
/datum/supply_packs/hydro/watertank
|
||||
name = "Water tank crate"
|
||||
contains = list(/obj/structure/reagent_dispensers/watertank)
|
||||
cost = 8
|
||||
cost = 10
|
||||
containertype = /obj/structure/largecrate
|
||||
containername = "water tank crate"
|
||||
|
||||
@@ -142,7 +142,7 @@
|
||||
|
||||
/datum/supply_packs/hydro/tray
|
||||
name = "Empty hydroponics tray"
|
||||
cost = 30
|
||||
cost = 20
|
||||
containertype = /obj/structure/closet/crate/hydroponics
|
||||
containername = "Hydroponics tray crate"
|
||||
contains = list(/obj/machinery/portable_atmospherics/hydroponics{anchored = 0})
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
/datum/supply_packs/med/cryobag
|
||||
name = "Stasis bag crate"
|
||||
contains = list(/obj/item/bodybag/cryobag = 3)
|
||||
cost = 50
|
||||
cost = 40
|
||||
containertype = /obj/structure/closet/crate/medical
|
||||
containername = "Stasis bag crate"
|
||||
|
||||
@@ -75,7 +75,7 @@
|
||||
/obj/item/weapon/storage/box/gloves,
|
||||
/obj/item/weapon/storage/belt/medical = 3
|
||||
)
|
||||
cost = 15
|
||||
cost = 10
|
||||
containertype = "/obj/structure/closet/crate"
|
||||
containername = "Sterile equipment crate"
|
||||
|
||||
@@ -87,7 +87,7 @@
|
||||
/obj/item/device/radio/headset/headset_med/alt = 3,
|
||||
/obj/item/clothing/suit/storage/hooded/wintercoat/medical = 3
|
||||
)
|
||||
cost = 15
|
||||
cost = 10
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containername = "Medical surplus equipment"
|
||||
access = access_medical
|
||||
@@ -111,7 +111,7 @@
|
||||
/obj/item/device/flashlight/pen,
|
||||
/obj/item/weapon/reagent_containers/syringe
|
||||
)
|
||||
cost = 60
|
||||
cost = 50
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containername = "Chief medical officer equipment"
|
||||
access = access_cmo
|
||||
@@ -157,7 +157,7 @@
|
||||
/obj/item/weapon/storage/box/pillbottles,
|
||||
/obj/item/weapon/reagent_containers/syringe
|
||||
)
|
||||
cost = 15
|
||||
cost = 20
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containername = "Chemist equipment"
|
||||
access = access_chemistry
|
||||
@@ -204,7 +204,7 @@
|
||||
/obj/item/weapon/pen,
|
||||
/obj/item/weapon/cartridge/medical
|
||||
)
|
||||
cost = 15
|
||||
cost = 20
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containername = "Psychiatrist equipment"
|
||||
access = access_psychiatrist
|
||||
@@ -225,7 +225,7 @@
|
||||
/obj/item/weapon/storage/box/masks,
|
||||
/obj/item/weapon/storage/box/gloves
|
||||
)
|
||||
cost = 15
|
||||
cost = 10
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containername = "Medical scrubs crate"
|
||||
access = access_medical_equip
|
||||
@@ -269,7 +269,7 @@
|
||||
/obj/item/weapon/storage/box/masks,
|
||||
/obj/item/weapon/storage/box/gloves
|
||||
)
|
||||
cost = 15
|
||||
cost = 10
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containername = "Medical uniform crate"
|
||||
access = access_medical_equip
|
||||
|
||||
@@ -67,7 +67,7 @@
|
||||
/obj/item/clothing/accessory/storage/white_drop_pouches,
|
||||
/obj/item/clothing/accessory/storage/webbing
|
||||
)
|
||||
cost = 15
|
||||
cost = 10
|
||||
containertype = "/obj/structure/closet/crate"
|
||||
containername = "Webbing crate"
|
||||
|
||||
@@ -92,6 +92,6 @@
|
||||
/obj/item/clothing/head/helmet/space/emergency = 4,
|
||||
/obj/item/clothing/mask/gas = 4
|
||||
)
|
||||
cost = 45
|
||||
cost = 35
|
||||
containertype = /obj/structure/closet/crate/internals
|
||||
containername = "Emergency crate"
|
||||
@@ -40,7 +40,7 @@
|
||||
contains = list(
|
||||
/obj/item/weapon/gun/energy/xray = 2,
|
||||
/obj/item/weapon/shield/energy = 2)
|
||||
cost = 125
|
||||
cost = 100
|
||||
containertype = /obj/structure/closet/crate/secure/weapon
|
||||
containername = "Experimental weapons crate"
|
||||
access = access_armory
|
||||
@@ -60,7 +60,7 @@
|
||||
/obj/item/weapon/storage/box/shotgunshells,
|
||||
/obj/item/weapon/gun/projectile/shotgun/pump/combat = 2
|
||||
)
|
||||
cost = 65
|
||||
cost = 50
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "Shotgun crate"
|
||||
access = access_armory
|
||||
@@ -68,7 +68,7 @@
|
||||
/datum/supply_packs/munitions/erifle
|
||||
name = "Energy marksman crate"
|
||||
contains = list(/obj/item/weapon/gun/energy/sniperrifle = 2)
|
||||
cost = 90
|
||||
cost = 100
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "Energy marksman crate"
|
||||
access = access_armory
|
||||
@@ -91,7 +91,7 @@
|
||||
/obj/item/weapon/gun/projectile/automatic/wt550,
|
||||
/obj/item/weapon/gun/projectile/automatic/z8
|
||||
)
|
||||
cost = 90
|
||||
cost = 100
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "Automatic weapon crate"
|
||||
access = access_armory
|
||||
@@ -119,12 +119,12 @@
|
||||
containername = "Weapons crate"
|
||||
|
||||
/datum/supply_packs/munitions/shotgunammo
|
||||
name = "Ballistic ammunition crate"
|
||||
name = "Shotgun ammunition crate"
|
||||
contains = list(
|
||||
/obj/item/weapon/storage/box/shotgunammo = 2,
|
||||
/obj/item/weapon/storage/box/shotgunshells = 2
|
||||
)
|
||||
cost = 60
|
||||
cost = 25
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "ballistic ammunition crate"
|
||||
access = access_armory
|
||||
@@ -137,7 +137,7 @@
|
||||
/obj/item/ammo_magazine/mc9mmt/rubber,
|
||||
/obj/item/ammo_magazine/a556
|
||||
)
|
||||
cost = 20
|
||||
cost = 25
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "Automatic weapon ammunition crate"
|
||||
access = access_armory
|
||||
@@ -145,7 +145,7 @@
|
||||
/datum/supply_packs/munitions/beanbagammo
|
||||
name = "Beanbag shells"
|
||||
contains = list(/obj/item/weapon/storage/box/beanbags = 3)
|
||||
cost = 30
|
||||
cost = 25
|
||||
containertype = /obj/structure/closet/crate
|
||||
containername = "Beanbag shells"
|
||||
access = null
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
/obj/item/weapon/material/twohanded/spear/foam = 2,
|
||||
/obj/item/weapon/material/twohanded/fireaxe/foam = 2
|
||||
)
|
||||
cost = 80
|
||||
cost = 50
|
||||
containertype = /obj/structure/closet/crate
|
||||
containername = "foam weapon crate"
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
)
|
||||
containertype = /obj/structure/closet
|
||||
containername = "Lasertag Closet"
|
||||
cost = 20
|
||||
cost = 10
|
||||
|
||||
/datum/supply_packs/recreation/artscrafts
|
||||
name = "Arts and Crafts supplies"
|
||||
|
||||
@@ -58,7 +58,7 @@
|
||||
/obj/item/weapon/circuitboard/mecha/ripley/main,
|
||||
/obj/item/weapon/circuitboard/mecha/ripley/peripherals
|
||||
)
|
||||
cost = 30
|
||||
cost = 25
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "APLU \"Ripley\" Circuit Crate"
|
||||
access = access_robotics
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
/datum/supply_packs/sci/coolanttank
|
||||
name = "Coolant tank crate"
|
||||
contains = list(/obj/structure/reagent_dispensers/coolanttank)
|
||||
cost = 16
|
||||
cost = 15
|
||||
containertype = /obj/structure/largecrate
|
||||
containername = "coolant tank crate"
|
||||
|
||||
|
||||
@@ -82,7 +82,7 @@
|
||||
/obj/item/clothing/gloves/arm_guard/bulletproof,
|
||||
/obj/item/clothing/shoes/leg_guard/bulletproof
|
||||
)
|
||||
cost = 35
|
||||
cost = 40
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "bullet resistant armor set crate"
|
||||
access = access_armory
|
||||
@@ -104,7 +104,7 @@
|
||||
name = "Tactical suits"
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "Tactical Suit Locker"
|
||||
cost = 60
|
||||
cost = 40
|
||||
access = access_armory
|
||||
contains = list(
|
||||
/obj/item/clothing/under/tactical,
|
||||
@@ -162,7 +162,7 @@
|
||||
/obj/item/device/radio/headset/headset_sec/alt = 3,
|
||||
/obj/item/clothing/suit/storage/hooded/wintercoat/security = 3
|
||||
)
|
||||
cost = 25
|
||||
cost = 10
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containername = "Security surplus equipment"
|
||||
access = null
|
||||
@@ -189,7 +189,7 @@
|
||||
/obj/item/device/flashlight/maglight,
|
||||
/obj/item/weapon/storage/briefcase/crimekit
|
||||
)
|
||||
cost = 40
|
||||
cost = 20
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containername = "Forensic equipment"
|
||||
access = access_forensics_lockers
|
||||
@@ -210,7 +210,7 @@
|
||||
/obj/item/clothing/accessory/badge/holo/detective = 2,
|
||||
/obj/item/clothing/gloves/black = 2
|
||||
)
|
||||
cost = 20
|
||||
cost = 10
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containername = "Investigation clothing"
|
||||
access = access_forensics_lockers
|
||||
@@ -240,7 +240,7 @@
|
||||
/obj/item/weapon/gun/energy/taser,
|
||||
/obj/item/device/flashlight/maglight
|
||||
)
|
||||
cost = 30
|
||||
cost = 20
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containername = "Officer equipment"
|
||||
access = access_brig
|
||||
@@ -268,7 +268,7 @@
|
||||
/obj/item/clothing/head/beret/sec/corporate/warden,
|
||||
/obj/item/device/flashlight/maglight
|
||||
)
|
||||
cost = 45
|
||||
cost = 20
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containername = "Warden equipment"
|
||||
access = access_armory
|
||||
@@ -294,7 +294,7 @@
|
||||
/obj/item/clothing/head/beret/sec/corporate/hos,
|
||||
/obj/item/device/flashlight/maglight
|
||||
)
|
||||
cost = 65
|
||||
cost = 50
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containername = "Head of security equipment"
|
||||
access = access_hos
|
||||
@@ -314,7 +314,7 @@
|
||||
/obj/item/clothing/gloves/black = 4,
|
||||
/obj/item/weapon/storage/box/holobadge
|
||||
)
|
||||
cost = 20
|
||||
cost = 10
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containername = "Security uniform crate"
|
||||
|
||||
@@ -335,7 +335,7 @@
|
||||
/obj/item/clothing/gloves/black = 4,
|
||||
/obj/item/weapon/storage/box/holobadge
|
||||
)
|
||||
cost = 20
|
||||
cost = 10
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containername = "Navy blue security uniform crate"
|
||||
|
||||
@@ -355,21 +355,22 @@
|
||||
/obj/item/clothing/gloves/black = 4,
|
||||
/obj/item/weapon/storage/box/holobadge
|
||||
)
|
||||
cost = 20
|
||||
cost = 10
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containername = "Corporate security uniform crate"
|
||||
|
||||
/datum/supply_packs/security/biosuit
|
||||
name = "Security biohazard gear"
|
||||
contains = list(
|
||||
/obj/item/clothing/head/bio_hood/security,
|
||||
/obj/item/clothing/under/rank/security,
|
||||
/obj/item/clothing/suit/bio_suit/security,
|
||||
/obj/item/clothing/shoes/white,
|
||||
/obj/item/clothing/mask/gas,
|
||||
/obj/item/weapon/tank/oxygen,
|
||||
/obj/item/clothing/gloves/latex
|
||||
/obj/item/clothing/head/bio_hood/security = 3,
|
||||
/obj/item/clothing/under/rank/security = 3,
|
||||
/obj/item/clothing/suit/bio_suit/security = 3,
|
||||
/obj/item/clothing/shoes/white = 3,
|
||||
/obj/item/clothing/mask/gas = 3,
|
||||
/obj/item/weapon/tank/oxygen = 3,
|
||||
/obj/item/clothing/gloves/latex,
|
||||
/obj/item/weapon/storage/box/gloves
|
||||
)
|
||||
cost = 35
|
||||
cost = 50
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containername = "Security biohazard gear"
|
||||
|
||||
@@ -103,7 +103,7 @@
|
||||
/obj/item/clothing/glasses/material,
|
||||
/obj/item/clothing/glasses/meson
|
||||
)
|
||||
cost = 15
|
||||
cost = 10
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containername = "Shaft miner equipment"
|
||||
access = access_mining
|
||||
@@ -118,7 +118,7 @@
|
||||
/datum/supply_packs/supply/cargotrain
|
||||
name = "Cargo Train Tug"
|
||||
contains = list(/obj/vehicle/train/cargo/engine)
|
||||
cost = 45
|
||||
cost = 35
|
||||
containertype = /obj/structure/largecrate
|
||||
containername = "Cargo Train Tug Crate"
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
/obj/item/clothing/shoes/magboots = 2,
|
||||
/obj/item/weapon/tank/oxygen = 2,
|
||||
)
|
||||
cost = 45
|
||||
cost = 40
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containername = "Atmospheric voidsuit crate"
|
||||
access = access_atmospherics
|
||||
@@ -58,7 +58,7 @@
|
||||
/obj/item/clothing/shoes/magboots = 2,
|
||||
/obj/item/weapon/tank/oxygen = 2
|
||||
)
|
||||
cost = 55
|
||||
cost = 40
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containername = "Security voidsuit crate"
|
||||
|
||||
@@ -70,7 +70,7 @@
|
||||
/obj/item/clothing/mask/breath = 2,
|
||||
/obj/item/weapon/tank/oxygen = 2
|
||||
)
|
||||
cost = 35
|
||||
cost = 40
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containername = "Mining voidsuit crate"
|
||||
access = access_mining
|
||||
@@ -99,19 +99,23 @@
|
||||
|
||||
// Prune restricted status. Broke it up for readability.
|
||||
// Note that this is done before jobs are handed out.
|
||||
for(var/datum/mind/player in ticker.mode.get_players_for_role(role_type, id))
|
||||
candidates = ticker.mode.get_players_for_role(role_type, id, ghosts_only)
|
||||
for(var/datum/mind/player in candidates)
|
||||
if(ghosts_only && !istype(player.current, /mob/observer/dead))
|
||||
log_debug("[key_name(player)] is not eligible to become a [role_text]: Only ghosts may join as this role!")
|
||||
candidates -= player
|
||||
log_debug("[key_name(player)] is not eligible to become a [role_text]: Only ghosts may join as this role! They have been removed from the draft.")
|
||||
else if(player.special_role)
|
||||
log_debug("[key_name(player)] is not eligible to become a [role_text]: They already have a special role ([player.special_role])!")
|
||||
candidates -= player
|
||||
log_debug("[key_name(player)] is not eligible to become a [role_text]: They already have a special role ([player.special_role])! They have been removed from the draft.")
|
||||
else if (player in pending_antagonists)
|
||||
log_debug("[key_name(player)] is not eligible to become a [role_text]: They have already been selected for this role!")
|
||||
candidates -= player
|
||||
log_debug("[key_name(player)] is not eligible to become a [role_text]: They have already been selected for this role! They have been removed from the draft.")
|
||||
else if(!can_become_antag(player))
|
||||
log_debug("[key_name(player)] is not eligible to become a [role_text]: They are blacklisted for this role!")
|
||||
candidates -= player
|
||||
log_debug("[key_name(player)] is not eligible to become a [role_text]: They are blacklisted for this role! They have been removed from the draft.")
|
||||
else if(player_is_antag(player))
|
||||
log_debug("[key_name(player)] is not eligible to become a [role_text]: They are already an antagonist!")
|
||||
else
|
||||
candidates += player
|
||||
candidates -= player
|
||||
log_debug("[key_name(player)] is not eligible to become a [role_text]: They are already an antagonist! They have been removed from the draft.")
|
||||
|
||||
return candidates
|
||||
|
||||
|
||||
65
code/game/antagonist/outsider/trader.dm
Normal file
65
code/game/antagonist/outsider/trader.dm
Normal file
@@ -0,0 +1,65 @@
|
||||
var/datum/antagonist/trader/traders
|
||||
|
||||
/datum/antagonist/trader
|
||||
id = MODE_TRADE
|
||||
role_type = BE_OPERATIVE
|
||||
role_text = "Trader"
|
||||
role_text_plural = "Traders"
|
||||
welcome_text = "As a crewmember of the Beruang, you answer to your captain and international laws of space."
|
||||
antag_text = "You are an <b>non-antagonist</b> visitor! Within the rules, \
|
||||
try to provide interesting interaction for the crew. \
|
||||
Try to make sure other players have <i>fun</i>! If you are confused or at a loss, always adminhelp, \
|
||||
and before taking extreme actions, please try to also contact the administration! \
|
||||
Think through your actions and make the roleplay immersive! <b>Please remember all \
|
||||
rules apply to you.</b>"
|
||||
leader_welcome_text = "As Captain of the Beruang, you have control over your crew and cargo. It may be worth briefly discussing a consistent shared backstory with your crew."
|
||||
landmark_id = "Trader"
|
||||
|
||||
id_type = /obj/item/weapon/card/id/external
|
||||
|
||||
flags = ANTAG_OVERRIDE_JOB | ANTAG_SET_APPEARANCE | ANTAG_HAS_LEADER | ANTAG_CHOOSE_NAME
|
||||
|
||||
hard_cap = 5
|
||||
hard_cap_round = 7
|
||||
initial_spawn_req = 5
|
||||
initial_spawn_target = 7
|
||||
|
||||
/datum/antagonist/trader/create_default(var/mob/source)
|
||||
var/mob/living/carbon/human/M = ..()
|
||||
if(istype(M)) M.age = rand(25,45)
|
||||
|
||||
/datum/antagonist/trader/New()
|
||||
..()
|
||||
traders = src
|
||||
|
||||
/datum/antagonist/trader/greet(var/datum/mind/player)
|
||||
if(!..())
|
||||
return
|
||||
player.current << "The Beruang is an independent cargo hauler, unless you decide otherwise. You're on your way to [station_name()]."
|
||||
player.current << "You may want to discuss a collective story with the rest of your crew. More members may be joining, so don't move out straight away!"
|
||||
|
||||
/datum/antagonist/trader/equip(var/mob/living/carbon/human/player)
|
||||
player.equip_to_slot_or_del(new /obj/item/clothing/under/rank/cargotech(src), slot_w_uniform)
|
||||
player.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(src), slot_shoes)
|
||||
player.equip_to_slot_or_del(new /obj/item/clothing/gloves/brown(src), slot_gloves)
|
||||
player.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(src), slot_glasses)
|
||||
|
||||
create_radio(PUB_FREQ, player) //Assume they tune their headsets into the station's public radio as they approach
|
||||
|
||||
var/obj/item/weapon/card/id/id = create_id("Trader", player, equip = 0)
|
||||
id.name = "[player.real_name]'s Passport"
|
||||
id.assignment = "Trader"
|
||||
id.access |= access_trader
|
||||
var/obj/item/weapon/storage/wallet/W = new(player)
|
||||
W.handle_item_insertion(id)
|
||||
player.equip_to_slot_or_del(W, slot_wear_id)
|
||||
spawn_money(rand(50,150)*10,W)
|
||||
|
||||
return 1
|
||||
|
||||
/datum/antagonist/trader/update_access(var/mob/living/player)
|
||||
for(var/obj/item/weapon/storage/wallet/W in player.contents)
|
||||
for(var/obj/item/weapon/card/id/id in W.contents)
|
||||
id.name = "[player.real_name]'s Passport"
|
||||
id.registered_name = player.real_name
|
||||
W.name = "[initial(W.name)] ([id.name])"
|
||||
@@ -351,6 +351,14 @@ area/space/atmosalert()
|
||||
name = "\improper Administration Shuttle"
|
||||
icon_state = "shuttlered2"
|
||||
|
||||
/area/shuttle/trade/centcom
|
||||
name = "\improper Trade Shuttle Centcom"
|
||||
icon_state = "shuttlered"
|
||||
|
||||
/area/shuttle/trade/station
|
||||
name = "\improper Trade Shuttle"
|
||||
icon_state = "shuttlered"
|
||||
|
||||
/area/shuttle/thunderdome
|
||||
name = "honk"
|
||||
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
src.invisibility = INVISIBILITY_MAXIMUM
|
||||
density = 0
|
||||
|
||||
/obj/machinery/cooking/cultify()
|
||||
/obj/machinery/cooker/cultify()
|
||||
new /obj/structure/cult/talisman(loc)
|
||||
qdel(src)
|
||||
|
||||
|
||||
@@ -372,7 +372,7 @@ var/global/list/additional_antag_types = list()
|
||||
/datum/game_mode/proc/check_win() //universal trigger to be called at mob death, nuke explosion, etc. To be called from everywhere.
|
||||
return 0
|
||||
|
||||
/datum/game_mode/proc/get_players_for_role(var/role, var/antag_id)
|
||||
/datum/game_mode/proc/get_players_for_role(var/role, var/antag_id, var/ghosts_only)
|
||||
var/list/players = list()
|
||||
var/list/candidates = list()
|
||||
|
||||
@@ -387,6 +387,8 @@ var/global/list/additional_antag_types = list()
|
||||
continue
|
||||
if(istype(player, /mob/new_player))
|
||||
continue
|
||||
if(istype(player, /mob/observer/dead) && !ghosts_only)
|
||||
continue
|
||||
if(!role || (player.client.prefs.be_special & role))
|
||||
log_debug("[player.key] had [antag_id] enabled, so we are drafting them.")
|
||||
candidates |= player.mind
|
||||
|
||||
@@ -12,4 +12,5 @@
|
||||
#define ACCESS_TYPE_CENTCOM 1
|
||||
#define ACCESS_TYPE_STATION 2
|
||||
#define ACCESS_TYPE_SYNDICATE 4
|
||||
#define ACCESS_TYPE_ALL (ACCESS_TYPE_CENTCOM|ACCESS_TYPE_STATION|ACCESS_TYPE_SYNDICATE)
|
||||
#define ACCESS_TYPE_PRIVATE 8
|
||||
#define ACCESS_TYPE_ALL (ACCESS_TYPE_CENTCOM|ACCESS_TYPE_STATION|ACCESS_TYPE_SYNDICATE|ACCESS_TYPE_PRIVATE)
|
||||
|
||||
@@ -125,6 +125,13 @@
|
||||
|
||||
return priv_syndicate_access
|
||||
|
||||
/var/list/priv_private_access
|
||||
/proc/get_all_private_access()
|
||||
if(!priv_private_access)
|
||||
priv_private_access = get_access_ids(ACCESS_TYPE_PRIVATE)
|
||||
|
||||
return priv_syndicate_access
|
||||
|
||||
/var/list/priv_region_access
|
||||
/proc/get_region_accesses(var/code)
|
||||
if(code == ACCESS_REGION_ALL)
|
||||
|
||||
@@ -457,3 +457,8 @@
|
||||
/datum/access/crate_cash
|
||||
id = access_crate_cash
|
||||
access_type = ACCESS_TYPE_NONE
|
||||
|
||||
/var/const/access_trader = 160//General Beruang Trader Access
|
||||
/datum/access/trader
|
||||
id = access_trader
|
||||
access_type = ACCESS_TYPE_PRIVATE
|
||||
|
||||
@@ -72,6 +72,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
|
||||
supervisors = "the captain"
|
||||
selection_color = "#2F2F7F"
|
||||
idtype = /obj/item/weapon/card/id/silver
|
||||
alt_titles = list("Crew Resources Officer")
|
||||
req_admin_notify = 1
|
||||
minimal_player_age = 10
|
||||
economic_modifier = 10
|
||||
|
||||
@@ -342,7 +342,7 @@ var/global/datum/controller/occupations/job_master
|
||||
else
|
||||
permitted = 1
|
||||
|
||||
if(G.whitelisted && !is_alien_whitelisted(H, G.whitelisted))
|
||||
if(G.whitelisted && !is_alien_whitelisted(H, all_species[G.whitelisted]))
|
||||
permitted = 0
|
||||
|
||||
if(!permitted)
|
||||
|
||||
@@ -30,22 +30,48 @@ var/list/whitelist = list()
|
||||
else
|
||||
alien_whitelist = splittext(text, "\n")
|
||||
|
||||
//todo: admin aliens
|
||||
/proc/is_alien_whitelisted(mob/M, var/species)
|
||||
if(!config.usealienwhitelist)
|
||||
return 1
|
||||
if(species == "human" || species == "Human")
|
||||
return 1
|
||||
if(check_rights(R_ADMIN, 0))
|
||||
return 1
|
||||
if(!alien_whitelist)
|
||||
return 0
|
||||
if(M && species)
|
||||
/proc/is_alien_whitelisted(mob/M, var/datum/species/species)
|
||||
//They are admin or the whitelist isn't in use
|
||||
if(whitelist_overrides(M)) return 1
|
||||
|
||||
//You did something wrong
|
||||
if(!M || !species) return 0
|
||||
|
||||
//The species isn't even whitelisted
|
||||
if(!(species.spawn_flags & SPECIES_IS_WHITELISTED)) return 1
|
||||
|
||||
//If we have a loaded file, search it
|
||||
if(alien_whitelist)
|
||||
for (var/s in alien_whitelist)
|
||||
if(findtext(s,"[M.ckey] - [species]"))
|
||||
if(findtext(s,"[M.ckey] - [species.name]"))
|
||||
return 1
|
||||
if(findtext(s,"[M.ckey] - All"))
|
||||
return 1
|
||||
|
||||
/proc/is_lang_whitelisted(mob/M, var/datum/language/language)
|
||||
//They are admin or the whitelist isn't in use
|
||||
if(whitelist_overrides(M)) return 1
|
||||
|
||||
//You did something wrong
|
||||
if(!M || !language) return 0
|
||||
|
||||
//The language isn't even whitelisted
|
||||
if(!(language.flags & WHITELISTED)) return 1
|
||||
|
||||
//If we have a loaded file, search it
|
||||
if(alien_whitelist)
|
||||
for (var/s in alien_whitelist)
|
||||
if(findtext(s,"[M.ckey] - [language.name]"))
|
||||
return 1
|
||||
if(findtext(s,"[M.ckey] - All"))
|
||||
return 1
|
||||
|
||||
/proc/whitelist_overrides(mob/M)
|
||||
if(!config.usealienwhitelist)
|
||||
return 1
|
||||
if(check_rights(R_ADMIN, 0))
|
||||
return 1
|
||||
|
||||
return 0
|
||||
|
||||
#undef WHITELISTFILE
|
||||
|
||||
@@ -36,6 +36,11 @@
|
||||
path = /obj/item/weapon/reagent_containers/glass/bucket
|
||||
category = "General"
|
||||
|
||||
/datum/autolathe/recipe/cooler_bottle
|
||||
name = "water-cooler bottle"
|
||||
path = /obj/item/weapon/reagent_containers/glass/cooler_bottle
|
||||
category = "General"
|
||||
|
||||
/datum/autolathe/recipe/drinkingglass
|
||||
name = "drinking glass"
|
||||
path = /obj/item/weapon/reagent_containers/food/drinks/glass2/square
|
||||
|
||||
@@ -17,8 +17,7 @@ var/global/list/station_networks = list(
|
||||
NETWORK_RESEARCH_OUTPOST,
|
||||
NETWORK_ROBOTS,
|
||||
NETWORK_PRISON,
|
||||
NETWORK_SECURITY,
|
||||
NETWORK_COMMUNICATORS
|
||||
NETWORK_SECURITY
|
||||
)
|
||||
var/global/list/engineering_networks = list(
|
||||
NETWORK_ENGINE,
|
||||
|
||||
242
code/game/machinery/kitchen/cooking_machines/_cooker.dm
Normal file
242
code/game/machinery/kitchen/cooking_machines/_cooker.dm
Normal file
@@ -0,0 +1,242 @@
|
||||
// This folder contains code that was originally ported from Apollo Station and then refactored/optimized/changed.
|
||||
|
||||
// Tracks precooked food to stop deep fried baked grilled grilled grilled diona nymph cereal.
|
||||
/obj/item/weapon/reagent_containers/food/snacks/var/list/cooked
|
||||
|
||||
// Root type for cooking machines. See following files for specific implementations.
|
||||
/obj/machinery/cooker
|
||||
name = "cooker"
|
||||
desc = "You shouldn't be seeing this!"
|
||||
icon = 'icons/obj/cooking_machines.dmi'
|
||||
density = 1
|
||||
anchored = 1
|
||||
use_power = 1
|
||||
idle_power_usage = 5
|
||||
|
||||
var/on_icon // Icon state used when cooking.
|
||||
var/off_icon // Icon state used when not cooking.
|
||||
var/cooking // Whether or not the machine is currently operating.
|
||||
var/cook_type // A string value used to track what kind of food this machine makes.
|
||||
var/cook_time = 200 // How many ticks the cooking will take.
|
||||
var/can_cook_mobs // Whether or not this machine accepts grabbed mobs.
|
||||
var/food_color // Colour of resulting food item.
|
||||
var/cooked_sound // Sound played when cooking completes.
|
||||
var/can_burn_food // Can the object burn food that is left inside?
|
||||
var/burn_chance = 10 // How likely is the food to burn?
|
||||
var/obj/item/cooking_obj // Holder for the currently cooking object.
|
||||
|
||||
// If the machine has multiple output modes, define them here.
|
||||
var/selected_option
|
||||
var/list/output_options = list()
|
||||
|
||||
/obj/machinery/cooker/Destroy()
|
||||
if(cooking_obj)
|
||||
qdel(cooking_obj)
|
||||
cooking_obj = null
|
||||
return ..()
|
||||
|
||||
/obj/machinery/cooker/examine()
|
||||
..()
|
||||
if(cooking_obj && Adjacent(usr))
|
||||
usr << "You can see \a [cooking_obj] inside."
|
||||
|
||||
/obj/machinery/cooker/attackby(var/obj/item/I, var/mob/user)
|
||||
|
||||
if(!cook_type || (stat & (NOPOWER|BROKEN)))
|
||||
user << "<span class='warning'>\The [src] is not working.</span>"
|
||||
return
|
||||
|
||||
if(cooking)
|
||||
user << "<span class='warning'>\The [src] is running!</span>"
|
||||
return
|
||||
|
||||
// We are trying to cook a grabbed mob.
|
||||
var/obj/item/weapon/grab/G = I
|
||||
if(istype(G))
|
||||
|
||||
if(!can_cook_mobs)
|
||||
user << "<span class='warning'>That's not going to fit.</span>"
|
||||
return
|
||||
|
||||
if(!isliving(G.affecting))
|
||||
user << "<span class='warning'>You can't cook that.</span>"
|
||||
return
|
||||
|
||||
cook_mob(G.affecting, user)
|
||||
return
|
||||
|
||||
// We're trying to cook something else. Check if it's valid.
|
||||
var/obj/item/weapon/reagent_containers/food/snacks/check = I
|
||||
if(istype(check) && islist(check.cooked) && (cook_type in check.cooked))
|
||||
user << "<span class='warning'>\The [check] has already been [cook_type].</span>"
|
||||
return 0
|
||||
else if(istype(check, /obj/item/weapon/reagent_containers/glass))
|
||||
user << "<span class='warning'>That would probably break [src].</span>"
|
||||
return 0
|
||||
else if(istype(check, /obj/item/weapon/disk/nuclear))
|
||||
user << "Central Command would kill you if you [cook_type] that."
|
||||
return 0
|
||||
else if(!istype(check) && !istype(check, /obj/item/weapon/holder) && !istype(check, /obj/item/organ))
|
||||
user << "<span class='warning'>That's not edible.</span>"
|
||||
return 0
|
||||
|
||||
if(istype(I, /obj/item/organ))
|
||||
var/obj/item/organ/O = I
|
||||
if(O.robotic)
|
||||
user << "<span class='warning'>That would probably break [src].</span>"
|
||||
return
|
||||
|
||||
// Gotta hurt.
|
||||
if(istype(cooking_obj, /obj/item/weapon/holder))
|
||||
for(var/mob/living/M in cooking_obj.contents)
|
||||
M.apply_damage(rand(30,40), BURN, "chest")
|
||||
|
||||
// Not sure why a food item that passed the previous checks would fail to drop, but safety first.
|
||||
if(!user.unEquip(I))
|
||||
return
|
||||
|
||||
// We can actually start cooking now.
|
||||
user.visible_message("<span class='notice'>\The [user] puts \the [I] into \the [src].</span>")
|
||||
cooking_obj = I
|
||||
cooking_obj.forceMove(src)
|
||||
cooking = 1
|
||||
icon_state = on_icon
|
||||
|
||||
// Doop de doo. Jeopardy theme goes here.
|
||||
sleep(cook_time)
|
||||
|
||||
// Sanity checks.
|
||||
if(!cooking_obj || cooking_obj.loc != src)
|
||||
cooking_obj = null
|
||||
icon_state = off_icon
|
||||
cooking = 0
|
||||
return
|
||||
|
||||
// RIP slow-moving held mobs.
|
||||
if(istype(cooking_obj, /obj/item/weapon/holder))
|
||||
for(var/mob/living/M in cooking_obj.contents)
|
||||
M.death()
|
||||
|
||||
// Cook the food.
|
||||
var/cook_path
|
||||
if(selected_option && output_options.len)
|
||||
cook_path = output_options[selected_option]
|
||||
if(!cook_path)
|
||||
cook_path = /obj/item/weapon/reagent_containers/food/snacks/variable
|
||||
var/obj/item/weapon/reagent_containers/food/snacks/result = new cook_path(src) //Holy typepaths, Batman.
|
||||
|
||||
// Set icon and appearance.
|
||||
change_product_appearance(result)
|
||||
|
||||
// Update strings.
|
||||
change_product_strings(result)
|
||||
|
||||
// Copy reagents over. trans_to_obj must be used, as trans_to fails for snacks due to is_open_container() failing.
|
||||
if(cooking_obj.reagents && cooking_obj.reagents.total_volume)
|
||||
cooking_obj.reagents.trans_to_obj(result, cooking_obj.reagents.total_volume)
|
||||
|
||||
// Set cooked data.
|
||||
var/obj/item/weapon/reagent_containers/food/snacks/food_item = cooking_obj
|
||||
if(istype(food_item) && islist(food_item.cooked))
|
||||
result.cooked = food_item.cooked.Copy()
|
||||
else
|
||||
result.cooked = list()
|
||||
result.cooked |= cook_type
|
||||
|
||||
// Reset relevant variables.
|
||||
qdel(cooking_obj)
|
||||
src.visible_message("<span class='notice'>\The [src] pings!</span>")
|
||||
if(cooked_sound)
|
||||
playsound(get_turf(src), cooked_sound, 50, 1)
|
||||
|
||||
if(!can_burn_food)
|
||||
icon_state = off_icon
|
||||
cooking = 0
|
||||
result.forceMove(get_turf(src))
|
||||
cooking_obj = null
|
||||
else
|
||||
var/failed
|
||||
var/overcook_period = max(Floor(cook_time/5),1)
|
||||
cooking_obj = result
|
||||
var/count = overcook_period
|
||||
while(1)
|
||||
sleep(overcook_period)
|
||||
count += overcook_period
|
||||
if(!cooking || !result || result.loc != src)
|
||||
failed = 1
|
||||
else if(prob(burn_chance) || count == cook_time) //Fail before it has a chance to cook again.
|
||||
// You dun goofed.
|
||||
qdel(cooking_obj)
|
||||
cooking_obj = new /obj/item/weapon/reagent_containers/food/snacks/badrecipe(src)
|
||||
// Produce nasty smoke.
|
||||
visible_message("<span class='danger'>\The [src] vomits a gout of rancid smoke!</span>")
|
||||
var/datum/effect/effect/system/smoke_spread/bad/smoke = PoolOrNew(/datum/effect/effect/system/smoke_spread/bad)
|
||||
smoke.attach(src)
|
||||
smoke.set_up(10, 0, usr.loc)
|
||||
smoke.start()
|
||||
failed = 1
|
||||
|
||||
if(failed)
|
||||
cooking = 0
|
||||
icon_state = off_icon
|
||||
break
|
||||
|
||||
/obj/machinery/cooker/attack_hand(var/mob/user)
|
||||
|
||||
if(cooking_obj)
|
||||
user << "<span class='notice'>You grab \the [cooking_obj] from \the [src].</span>"
|
||||
user.put_in_hands(cooking_obj)
|
||||
cooking = 0
|
||||
cooking_obj = null
|
||||
icon_state = off_icon
|
||||
return
|
||||
|
||||
if(output_options.len)
|
||||
|
||||
if(cooking)
|
||||
user << "<span class='warning'>\The [src] is in use!</span>"
|
||||
return
|
||||
|
||||
var/choice = input("What specific food do you wish to make with \the [src]?") as null|anything in output_options+"Default"
|
||||
if(!choice)
|
||||
return
|
||||
if(choice == "Default")
|
||||
selected_option = null
|
||||
user << "<span class='notice'>You decide not to make anything specific with \the [src].</span>"
|
||||
else
|
||||
selected_option = choice
|
||||
user << "<span class='notice'>You prepare \the [src] to make \a [selected_option].</span>"
|
||||
|
||||
..()
|
||||
|
||||
/obj/machinery/cooker/proc/cook_mob(var/mob/living/victim, var/mob/user)
|
||||
return
|
||||
|
||||
/obj/machinery/cooker/proc/change_product_strings(var/obj/item/weapon/reagent_containers/food/snacks/product)
|
||||
if(product.type == /obj/item/weapon/reagent_containers/food/snacks/variable) // Base type, generic.
|
||||
product.name = "[cook_type] [cooking_obj.name]"
|
||||
product.desc = "[cooking_obj.desc] It has been [cook_type]."
|
||||
else
|
||||
product.name = "[cooking_obj.name] [product.name]"
|
||||
|
||||
/obj/machinery/cooker/proc/change_product_appearance(var/obj/item/weapon/reagent_containers/food/snacks/product)
|
||||
if(product.type == /obj/item/weapon/reagent_containers/food/snacks/variable) // Base type, generic.
|
||||
product.appearance = cooking_obj
|
||||
product.color = food_color
|
||||
product.filling_color = food_color
|
||||
|
||||
// Make 'em into a corpse.
|
||||
if(istype(cooking_obj, /obj/item/weapon/holder))
|
||||
var/matrix/M = matrix()
|
||||
M.Turn(90)
|
||||
M.Translate(1,-6)
|
||||
product.transform = M
|
||||
else
|
||||
var/image/I = image(product.icon, "[product.icon_state]_filling")
|
||||
if(istype(cooking_obj, /obj/item/weapon/reagent_containers/food/snacks))
|
||||
var/obj/item/weapon/reagent_containers/food/snacks/S = cooking_obj
|
||||
I.color = S.filling_color
|
||||
if(!I.color)
|
||||
I.color = food_color
|
||||
product.overlays += I
|
||||
|
||||
@@ -0,0 +1,72 @@
|
||||
// Wrapper obj for cooked food. Appearance is set in the cooking code, not on spawn.
|
||||
/obj/item/weapon/reagent_containers/food/snacks/variable
|
||||
name = "cooked food"
|
||||
icon = 'icons/obj/food_custom.dmi'
|
||||
desc = "If you can see this description then something is wrong. Please report the bug on the tracker."
|
||||
nutriment_amt = 5
|
||||
bitesize = 2
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/variable/pizza
|
||||
name = "personal pizza"
|
||||
desc = "A personalized pan pizza meant for only one person."
|
||||
icon_state = "personal_pizza"
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/variable/bread
|
||||
name = "bread"
|
||||
desc = "Tasty bread."
|
||||
icon_state = "breadcustom"
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/variable/pie
|
||||
name = "pie"
|
||||
desc = "Tasty pie."
|
||||
icon_state = "piecustom"
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/variable/cake
|
||||
name = "cake"
|
||||
desc = "A popular band."
|
||||
icon_state = "cakecustom"
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/variable/pocket
|
||||
name = "hot pocket"
|
||||
desc = "You wanna put a bangin- oh, nevermind."
|
||||
icon_state = "donk"
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/variable/kebab
|
||||
name = "kebab"
|
||||
desc = "Remove this!"
|
||||
icon_state = "kabob"
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/variable/waffles
|
||||
name = "waffles"
|
||||
desc = "Made with love."
|
||||
icon_state = "waffles"
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/variable/cookie
|
||||
name = "cookie"
|
||||
desc = "Sugar snap!"
|
||||
icon_state = "cookie"
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/variable/donut
|
||||
name = "filled donut"
|
||||
desc = "Donut eat this!" // kill me
|
||||
icon_state = "donut"
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/variable/jawbreaker
|
||||
name = "flavored jawbreaker"
|
||||
desc = "It's like cracking a molar on a rainbow."
|
||||
icon_state = "jawbreaker"
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/variable/candybar
|
||||
name = "flavored chocolate bar"
|
||||
desc = "Made in a factory downtown."
|
||||
icon_state = "bar"
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/variable/sucker
|
||||
name = "flavored sucker"
|
||||
desc = "Suck, suck, suck."
|
||||
icon_state = "sucker"
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/variable/jelly
|
||||
name = "jelly"
|
||||
desc = "All your friends will be jelly."
|
||||
icon_state = "jellycustom"
|
||||
18
code/game/machinery/kitchen/cooking_machines/candy.dm
Normal file
18
code/game/machinery/kitchen/cooking_machines/candy.dm
Normal file
@@ -0,0 +1,18 @@
|
||||
/obj/machinery/cooker/candy
|
||||
name = "candy machine"
|
||||
desc = "Get yer candied cheese wheels here!"
|
||||
icon_state = "mixer_off"
|
||||
off_icon = "mixer_off"
|
||||
on_icon = "mixer_on"
|
||||
cook_type = "candied"
|
||||
|
||||
output_options = list(
|
||||
"Jawbreaker" = /obj/item/weapon/reagent_containers/food/snacks/variable/jawbreaker,
|
||||
"Candy Bar" = /obj/item/weapon/reagent_containers/food/snacks/variable/candybar,
|
||||
"Sucker" = /obj/item/weapon/reagent_containers/food/snacks/variable/sucker,
|
||||
"Jelly" = /obj/item/weapon/reagent_containers/food/snacks/variable/jelly
|
||||
)
|
||||
|
||||
/obj/machinery/cooker/candy/change_product_appearance(var/obj/item/weapon/reagent_containers/food/snacks/cooked/product)
|
||||
food_color = get_random_colour(1)
|
||||
. = ..()
|
||||
25
code/game/machinery/kitchen/cooking_machines/cereal.dm
Normal file
25
code/game/machinery/kitchen/cooking_machines/cereal.dm
Normal file
@@ -0,0 +1,25 @@
|
||||
/obj/machinery/cooker/cereal
|
||||
name = "cereal maker"
|
||||
desc = "Now with Dann O's available!"
|
||||
icon = 'icons/obj/cooking_machines.dmi'
|
||||
icon_state = "cereal_off"
|
||||
cook_type = "cerealized"
|
||||
on_icon = "cereal_on"
|
||||
off_icon = "cereal_off"
|
||||
|
||||
/obj/machinery/cooker/cereal/change_product_strings(var/obj/item/weapon/reagent_containers/food/snacks/product)
|
||||
. = ..()
|
||||
product.name = "box of [cooking_obj.name] cereal"
|
||||
|
||||
/obj/machinery/cooker/cereal/change_product_appearance(var/obj/item/weapon/reagent_containers/food/snacks/product)
|
||||
product.icon = 'icons/obj/food.dmi'
|
||||
product.icon_state = "cereal_box"
|
||||
product.filling_color = cooking_obj.color
|
||||
|
||||
var/image/food_image = image(cooking_obj.icon, cooking_obj.icon_state)
|
||||
food_image.color = cooking_obj.color
|
||||
food_image.overlays += cooking_obj.overlays
|
||||
food_image.transform *= 0.7
|
||||
|
||||
product.overlays += food_image
|
||||
|
||||
67
code/game/machinery/kitchen/cooking_machines/fryer.dm
Normal file
67
code/game/machinery/kitchen/cooking_machines/fryer.dm
Normal file
@@ -0,0 +1,67 @@
|
||||
/obj/machinery/cooker/fryer
|
||||
name = "deep fryer"
|
||||
desc = "Deep fried <i>everything</i>."
|
||||
icon_state = "fryer_off"
|
||||
can_cook_mobs = 1
|
||||
cook_type = "deep fried"
|
||||
on_icon = "fryer_on"
|
||||
off_icon = "fryer_off"
|
||||
food_color = "#FFAD33"
|
||||
cooked_sound = 'sound/machines/ding.ogg'
|
||||
|
||||
/obj/machinery/cooker/fryer/cook_mob(var/mob/living/victim, var/mob/user)
|
||||
|
||||
if(!istype(victim))
|
||||
return
|
||||
|
||||
user.visible_message("<span class='danger'>\The [user] starts pushing \the [victim] into \the [src]!</span>")
|
||||
icon_state = on_icon
|
||||
cooking = 1
|
||||
|
||||
if(!do_mob(user, victim, 20))
|
||||
cooking = 0
|
||||
icon_state = off_icon
|
||||
return
|
||||
|
||||
if(!victim || !victim.Adjacent(user))
|
||||
user << "<span class='danger'>Your victim slipped free!</span>"
|
||||
cooking = 0
|
||||
icon_state = off_icon
|
||||
return
|
||||
|
||||
var/obj/item/organ/external/E
|
||||
var/nopain
|
||||
if(ishuman(victim) && user.zone_sel.selecting != "groin" && user.zone_sel.selecting != "chest")
|
||||
var/mob/living/carbon/human/H = victim
|
||||
if(H.species.flags & NO_PAIN)
|
||||
nopain = 2
|
||||
E = H.get_organ(user.zone_sel.selecting)
|
||||
if(E.status & ORGAN_ROBOT)
|
||||
nopain = 1
|
||||
|
||||
user.visible_message("<span class='danger'>\The [user] shoves \the [victim][E ? "'s [E.name]" : ""] into \the [src]!</span>")
|
||||
|
||||
if(E)
|
||||
E.take_damage(0, rand(20,30))
|
||||
if(E.children && E.children.len)
|
||||
for(var/obj/item/organ/external/child in E.children)
|
||||
if(nopain && nopain < 2 && !(child.status & ORGAN_ROBOT))
|
||||
nopain = 0
|
||||
child.take_damage(0, rand(20,30))
|
||||
else
|
||||
victim.apply_damage(rand(30,40), BURN, user.zone_sel.selecting)
|
||||
|
||||
if(!nopain)
|
||||
victim << "<span class='danger'>Agony consumes you as searing hot oil scorches your [E ? E.name : "flesh"] horribly!</span>"
|
||||
victim.emote("scream")
|
||||
else
|
||||
victim << "<span class='danger'>Searing hot oil scorches your [E ? E.name : "flesh"]!</span>"
|
||||
|
||||
if(victim.client)
|
||||
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Has [cook_type] \the [victim] ([victim.ckey]) in \a [src]</font>")
|
||||
victim.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been [cook_type] in \a [src] by [user.name] ([user.ckey])</font>")
|
||||
msg_admin_attack("[user] ([user.ckey]) [cook_type] \the [victim] ([victim.ckey]) in \a [src]. (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
|
||||
|
||||
icon_state = off_icon
|
||||
cooking = 0
|
||||
return
|
||||
10
code/game/machinery/kitchen/cooking_machines/grill.dm
Normal file
10
code/game/machinery/kitchen/cooking_machines/grill.dm
Normal file
@@ -0,0 +1,10 @@
|
||||
/obj/machinery/cooker/grill
|
||||
name = "grill"
|
||||
desc = "Backyard grilling, IN SPACE."
|
||||
icon_state = "grill_off"
|
||||
cook_type = "grilled"
|
||||
cook_time = 100
|
||||
food_color = "#A34719"
|
||||
on_icon = "grill_on"
|
||||
off_icon = "grill_off"
|
||||
can_burn_food = 1
|
||||
23
code/game/machinery/kitchen/cooking_machines/oven.dm
Normal file
23
code/game/machinery/kitchen/cooking_machines/oven.dm
Normal file
@@ -0,0 +1,23 @@
|
||||
/obj/machinery/cooker/oven
|
||||
name = "oven"
|
||||
desc = "Cookies are ready, dear."
|
||||
icon = 'icons/obj/cooking_machines.dmi'
|
||||
icon_state = "oven_off"
|
||||
on_icon = "oven_on"
|
||||
off_icon = "oven_off"
|
||||
cook_type = "baked"
|
||||
cook_time = 300
|
||||
food_color = "#A34719"
|
||||
can_burn_food = 1
|
||||
|
||||
output_options = list(
|
||||
"Personal Pizza" = /obj/item/weapon/reagent_containers/food/snacks/variable/pizza,
|
||||
"Bread" = /obj/item/weapon/reagent_containers/food/snacks/variable/bread,
|
||||
"Pie" = /obj/item/weapon/reagent_containers/food/snacks/variable/pie,
|
||||
"Small Cake" = /obj/item/weapon/reagent_containers/food/snacks/variable/cake,
|
||||
"Hot Pocket" = /obj/item/weapon/reagent_containers/food/snacks/variable/pocket,
|
||||
"Kebab" = /obj/item/weapon/reagent_containers/food/snacks/variable/kebab,
|
||||
"Waffles" = /obj/item/weapon/reagent_containers/food/snacks/variable/waffles,
|
||||
"Cookie" = /obj/item/weapon/reagent_containers/food/snacks/variable/cookie,
|
||||
"Donut" = /obj/item/weapon/reagent_containers/food/snacks/variable/donut,
|
||||
)
|
||||
196
code/game/machinery/kitchen/icecream.dm
Normal file
196
code/game/machinery/kitchen/icecream.dm
Normal file
@@ -0,0 +1,196 @@
|
||||
#define ICECREAM_VANILLA 1
|
||||
#define ICECREAM_CHOCOLATE 2
|
||||
#define ICECREAM_STRAWBERRY 3
|
||||
#define ICECREAM_BLUE 4
|
||||
#define CONE_WAFFLE 5
|
||||
#define CONE_CHOC 6
|
||||
|
||||
// Ported wholesale from Apollo Station.
|
||||
|
||||
/obj/machinery/icecream_vat
|
||||
name = "icecream vat"
|
||||
desc = "Ding-aling ding dong. Get your NanoTrasen-approved ice cream!"
|
||||
icon = 'icons/obj/kitchen.dmi'
|
||||
icon_state = "icecream_vat"
|
||||
density = 1
|
||||
anchored = 0
|
||||
use_power = 0
|
||||
flags = OPENCONTAINER | NOREACT
|
||||
|
||||
var/list/product_types = list()
|
||||
var/dispense_flavour = ICECREAM_VANILLA
|
||||
var/flavour_name = "vanilla"
|
||||
|
||||
/obj/machinery/icecream_vat/proc/get_ingredient_list(var/type)
|
||||
switch(type)
|
||||
if(ICECREAM_CHOCOLATE)
|
||||
return list("milk", "ice", "coco")
|
||||
if(ICECREAM_STRAWBERRY)
|
||||
return list("milk", "ice", "berryjuice")
|
||||
if(ICECREAM_BLUE)
|
||||
return list("milk", "ice", "singulo")
|
||||
if(CONE_WAFFLE)
|
||||
return list("flour", "sugar")
|
||||
if(CONE_CHOC)
|
||||
return list("flour", "sugar", "coco")
|
||||
else
|
||||
return list("milk", "ice")
|
||||
|
||||
/obj/machinery/icecream_vat/proc/get_flavour_name(var/flavour_type)
|
||||
switch(flavour_type)
|
||||
if(ICECREAM_CHOCOLATE)
|
||||
return "chocolate"
|
||||
if(ICECREAM_STRAWBERRY)
|
||||
return "strawberry"
|
||||
if(ICECREAM_BLUE)
|
||||
return "blue"
|
||||
if(CONE_WAFFLE)
|
||||
return "waffle"
|
||||
if(CONE_CHOC)
|
||||
return "chocolate"
|
||||
else
|
||||
return "vanilla"
|
||||
|
||||
/obj/machinery/icecream_vat/initialize()
|
||||
..()
|
||||
create_reagents(100)
|
||||
while(product_types.len < 6)
|
||||
product_types.Add(5)
|
||||
reagents.add_reagent("milk", 5)
|
||||
reagents.add_reagent("flour", 5)
|
||||
reagents.add_reagent("sugar", 5)
|
||||
reagents.add_reagent("ice", 5)
|
||||
|
||||
/obj/machinery/icecream_vat/attack_hand(mob/user as mob)
|
||||
user.set_machine(src)
|
||||
interact(user)
|
||||
|
||||
/obj/machinery/icecream_vat/interact(mob/user as mob)
|
||||
var/dat
|
||||
dat += "<b>ICECREAM</b><br><div class='statusDisplay'>"
|
||||
dat += "<b>Dispensing: [flavour_name] icecream </b> <br><br>"
|
||||
dat += "<b>Vanilla icecream:</b> <a href='?src=\ref[src];select=[ICECREAM_VANILLA]'><b>Select</b></a> <a href='?src=\ref[src];make=[ICECREAM_VANILLA];amount=1'><b>Make</b></a> <a href='?src=\ref[src];make=[ICECREAM_VANILLA];amount=5'><b>x5</b></a> [product_types[ICECREAM_VANILLA]] scoops left. (Ingredients: milk, ice)<br>"
|
||||
dat += "<b>Strawberry icecream:</b> <a href='?src=\ref[src];select=[ICECREAM_STRAWBERRY]'><b>Select</b></a> <a href='?src=\ref[src];make=[ICECREAM_STRAWBERRY];amount=1'><b>Make</b></a> <a href='?src=\ref[src];make=[ICECREAM_STRAWBERRY];amount=5'><b>x5</b></a> [product_types[ICECREAM_STRAWBERRY]] dollops left. (Ingredients: milk, ice, berry juice)<br>"
|
||||
dat += "<b>Chocolate icecream:</b> <a href='?src=\ref[src];select=[ICECREAM_CHOCOLATE]'><b>Select</b></a> <a href='?src=\ref[src];make=[ICECREAM_CHOCOLATE];amount=1'><b>Make</b></a> <a href='?src=\ref[src];make=[ICECREAM_CHOCOLATE];amount=5'><b>x5</b></a> [product_types[ICECREAM_CHOCOLATE]] dollops left. (Ingredients: milk, ice, coco powder)<br>"
|
||||
dat += "<b>Blue icecream:</b> <a href='?src=\ref[src];select=[ICECREAM_BLUE]'><b>Select</b></a> <a href='?src=\ref[src];make=[ICECREAM_BLUE];amount=1'><b>Make</b></a> <a href='?src=\ref[src];make=[ICECREAM_BLUE];amount=5'><b>x5</b></a> [product_types[ICECREAM_BLUE]] dollops left. (Ingredients: milk, ice, singulo)<br></div>"
|
||||
dat += "<br><b>CONES</b><br><div class='statusDisplay'>"
|
||||
dat += "<b>Waffle cones:</b> <a href='?src=\ref[src];cone=[CONE_WAFFLE]'><b>Dispense</b></a> <a href='?src=\ref[src];make=[CONE_WAFFLE];amount=1'><b>Make</b></a> <a href='?src=\ref[src];make=[CONE_WAFFLE];amount=5'><b>x5</b></a> [product_types[CONE_WAFFLE]] cones left. (Ingredients: flour, sugar)<br>"
|
||||
dat += "<b>Chocolate cones:</b> <a href='?src=\ref[src];cone=[CONE_CHOC]'><b>Dispense</b></a> <a href='?src=\ref[src];make=[CONE_CHOC];amount=1'><b>Make</b></a> <a href='?src=\ref[src];make=[CONE_CHOC];amount=5'><b>x5</b></a> [product_types[CONE_CHOC]] cones left. (Ingredients: flour, sugar, coco powder)<br></div>"
|
||||
dat += "<br>"
|
||||
dat += "<b>VAT CONTENT</b><br>"
|
||||
for(var/datum/reagent/R in reagents.reagent_list)
|
||||
dat += "[R.name]: [R.volume]"
|
||||
dat += "<A href='?src=\ref[src];disposeI=[R.id]'>Purge</A><BR>"
|
||||
dat += "<a href='?src=\ref[src];refresh=1'>Refresh</a> <a href='?src=\ref[src];close=1'>Close</a>"
|
||||
|
||||
var/datum/browser/popup = new(user, "icecreamvat","Icecream Vat", 700, 500, src)
|
||||
popup.set_content(dat)
|
||||
popup.open()
|
||||
|
||||
/obj/machinery/icecream_vat/attackby(var/obj/item/O as obj, var/mob/user as mob)
|
||||
if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/icecream))
|
||||
var/obj/item/weapon/reagent_containers/food/snacks/icecream/I = O
|
||||
if(!I.ice_creamed)
|
||||
if(product_types[dispense_flavour] > 0)
|
||||
src.visible_message("\icon[src] <span class='info'>[user] scoops delicious [flavour_name] icecream into [I].</span>")
|
||||
product_types[dispense_flavour] -= 1
|
||||
I.add_ice_cream(flavour_name)
|
||||
// if(beaker)
|
||||
// beaker.reagents.trans_to(I, 10)
|
||||
if(I.reagents.total_volume < 10)
|
||||
I.reagents.add_reagent("sugar", 10 - I.reagents.total_volume)
|
||||
else
|
||||
user << "<span class='warning'>There is not enough icecream left!</span>"
|
||||
else
|
||||
user << "<span class='notice'>[O] already has icecream in it.</span>"
|
||||
return 1
|
||||
else if(O.is_open_container())
|
||||
return
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/machinery/icecream_vat/proc/make(var/mob/user, var/make_type, var/amount)
|
||||
for(var/R in get_ingredient_list(make_type))
|
||||
if(reagents.has_reagent(R, amount))
|
||||
continue
|
||||
amount = 0
|
||||
break
|
||||
if(amount)
|
||||
for(var/R in get_ingredient_list(make_type))
|
||||
reagents.remove_reagent(R, amount)
|
||||
product_types[make_type] += amount
|
||||
var/flavour = get_flavour_name(make_type)
|
||||
if(make_type > 4)
|
||||
src.visible_message("<span class='info'>[user] cooks up some [flavour] cones.</span>")
|
||||
else
|
||||
src.visible_message("<span class='info'>[user] whips up some [flavour] icecream.</span>")
|
||||
else
|
||||
user << "<span class='warning'>You don't have the ingredients to make this.</span>"
|
||||
|
||||
/obj/machinery/icecream_vat/Topic(href, href_list)
|
||||
|
||||
if(..())
|
||||
return
|
||||
|
||||
if(href_list["select"])
|
||||
dispense_flavour = text2num(href_list["select"])
|
||||
flavour_name = get_flavour_name(dispense_flavour)
|
||||
src.visible_message("<span class='notice'>[usr] sets [src] to dispense [flavour_name] flavoured icecream.</span>")
|
||||
|
||||
if(href_list["cone"])
|
||||
var/dispense_cone = text2num(href_list["cone"])
|
||||
var/cone_name = get_flavour_name(dispense_cone)
|
||||
if(product_types[dispense_cone] >= 1)
|
||||
product_types[dispense_cone] -= 1
|
||||
var/obj/item/weapon/reagent_containers/food/snacks/icecream/I = new(src.loc)
|
||||
I.cone_type = cone_name
|
||||
I.icon_state = "icecream_cone_[cone_name]"
|
||||
I.desc = "Delicious [cone_name] cone, but no ice cream."
|
||||
src.visible_message("<span class='info'>[usr] dispenses a crunchy [cone_name] cone from [src].</span>")
|
||||
else
|
||||
usr << "<span class='warning'>There are no [cone_name] cones left!</span>"
|
||||
|
||||
if(href_list["make"])
|
||||
var/amount = (text2num(href_list["amount"]))
|
||||
var/C = text2num(href_list["make"])
|
||||
make(usr, C, amount)
|
||||
|
||||
if(href_list["disposeI"])
|
||||
reagents.del_reagent(href_list["disposeI"])
|
||||
|
||||
updateDialog()
|
||||
|
||||
if(href_list["refresh"])
|
||||
updateDialog()
|
||||
|
||||
if(href_list["close"])
|
||||
usr.unset_machine()
|
||||
usr << browse(null,"window=icecreamvat")
|
||||
return
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/icecream
|
||||
name = "ice cream cone"
|
||||
desc = "Delicious waffle cone, but no ice cream."
|
||||
icon_state = "icecream_cone_waffle" //default for admin-spawned cones, href_list["cone"] should overwrite this all the time
|
||||
layer = 3.1
|
||||
bitesize = 3
|
||||
|
||||
var/ice_creamed = 0
|
||||
var/cone_type
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/icecream/New()
|
||||
create_reagents(20)
|
||||
reagents.add_reagent("nutriment", 5)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/icecream/proc/add_ice_cream(var/flavour_name)
|
||||
name = "[flavour_name] icecream"
|
||||
src.overlays += "icecream_[flavour_name]"
|
||||
desc = "Delicious [cone_type] cone with a dollop of [flavour_name] ice cream."
|
||||
ice_creamed = 1
|
||||
|
||||
#undef ICECREAM_VANILLA
|
||||
#undef FLAVOUR_CHOCOLATE
|
||||
#undef FLAVOUR_STRAWBERRY
|
||||
#undef FLAVOUR_BLUE
|
||||
#undef CONE_WAFFLE
|
||||
#undef CONE_CHOC
|
||||
@@ -476,7 +476,7 @@ Buildable meters
|
||||
|
||||
if(PIPE_SUPPLY_STRAIGHT, PIPE_SUPPLY_BENT)
|
||||
var/obj/machinery/atmospherics/pipe/simple/hidden/supply/P = new( src.loc )
|
||||
P.color = color
|
||||
P.pipe_color = color
|
||||
P.set_dir(src.dir)
|
||||
P.initialize_directions = pipe_dir
|
||||
var/turf/T = P.loc
|
||||
@@ -495,7 +495,7 @@ Buildable meters
|
||||
|
||||
if(PIPE_SCRUBBERS_STRAIGHT, PIPE_SCRUBBERS_BENT)
|
||||
var/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers/P = new( src.loc )
|
||||
P.color = color
|
||||
P.pipe_color = color
|
||||
P.set_dir(src.dir)
|
||||
P.initialize_directions = pipe_dir
|
||||
var/turf/T = P.loc
|
||||
@@ -514,7 +514,7 @@ Buildable meters
|
||||
|
||||
if(PIPE_UNIVERSAL)
|
||||
var/obj/machinery/atmospherics/pipe/simple/hidden/universal/P = new( src.loc )
|
||||
P.color = color
|
||||
P.pipe_color = color
|
||||
P.set_dir(src.dir)
|
||||
P.initialize_directions = pipe_dir
|
||||
var/turf/T = P.loc
|
||||
@@ -588,7 +588,7 @@ Buildable meters
|
||||
|
||||
if(PIPE_SUPPLY_MANIFOLD) //manifold
|
||||
var/obj/machinery/atmospherics/pipe/manifold/hidden/supply/M = new( src.loc )
|
||||
M.color = color
|
||||
M.pipe_color = color
|
||||
M.set_dir(dir)
|
||||
M.initialize_directions = pipe_dir
|
||||
//M.New()
|
||||
@@ -611,7 +611,7 @@ Buildable meters
|
||||
|
||||
if(PIPE_SCRUBBERS_MANIFOLD) //manifold
|
||||
var/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers/M = new( src.loc )
|
||||
M.color = color
|
||||
M.pipe_color = color
|
||||
M.set_dir(dir)
|
||||
M.initialize_directions = pipe_dir
|
||||
//M.New()
|
||||
@@ -660,7 +660,7 @@ Buildable meters
|
||||
|
||||
if(PIPE_SUPPLY_MANIFOLD4W) //4-way manifold
|
||||
var/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply/M = new( src.loc )
|
||||
M.color = color
|
||||
M.pipe_color = color
|
||||
M.set_dir(dir)
|
||||
M.initialize_directions = pipe_dir
|
||||
M.connect_types = src.connect_types
|
||||
@@ -687,7 +687,7 @@ Buildable meters
|
||||
|
||||
if(PIPE_SCRUBBERS_MANIFOLD4W) //4-way manifold
|
||||
var/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers/M = new( src.loc )
|
||||
M.color = color
|
||||
M.pipe_color = color
|
||||
M.set_dir(dir)
|
||||
M.initialize_directions = pipe_dir
|
||||
M.connect_types = src.connect_types
|
||||
|
||||
@@ -32,7 +32,8 @@
|
||||
var/projectile = null //holder for bullettype
|
||||
var/eprojectile = null //holder for the shot when emagged
|
||||
var/reqpower = 500 //holder for power needed
|
||||
var/iconholder = null //holder for the icon_state. 1 for orange sprite, null for blue.
|
||||
var/iconholder = null //holder for the icon_state. 1 for sprite based on icon_color, null for blue.
|
||||
var/icon_color = "orange" // When iconholder is set to 1, the icon_state changes based on what is in this variable.
|
||||
var/egun = null //holder to handle certain guns switching bullettypes
|
||||
|
||||
var/last_fired = 0 //1: if the turret is cooling down from a shot, 0: turret is ready to fire
|
||||
@@ -59,6 +60,7 @@
|
||||
|
||||
var/wrenching = 0
|
||||
var/last_target //last target fired at, prevents turrets from erratically firing at all valid targets in range
|
||||
var/timeout = 10 // When a turret pops up, then finds nothing to shoot at, this number decrements until 0, when it pops down.
|
||||
|
||||
/obj/machinery/porta_turret/crescent
|
||||
enabled = 0
|
||||
@@ -75,6 +77,13 @@
|
||||
lethal = 1
|
||||
installation = /obj/item/weapon/gun/energy/laser
|
||||
|
||||
/obj/machinery/porta_turret/ai_defense
|
||||
name = "defense turret"
|
||||
desc = "This varient appears to be much more durable."
|
||||
installation = /obj/item/weapon/gun/energy/xray // For the armor pen.
|
||||
health = 250 // Since lasers do 40 each.
|
||||
maxhealth = 250
|
||||
|
||||
/obj/machinery/porta_turret/New()
|
||||
..()
|
||||
req_access.Cut()
|
||||
@@ -148,6 +157,14 @@
|
||||
eshot_sound = 'sound/weapons/Laser.ogg'
|
||||
egun = 1
|
||||
|
||||
if(/obj/item/weapon/gun/energy/xray)
|
||||
eprojectile = /obj/item/projectile/beam/xray
|
||||
projectile = /obj/item/projectile/beam/stun // Otherwise we fire xrays on both modes.
|
||||
eshot_sound = 'sound/weapons/eluger.ogg'
|
||||
shot_sound = 'sound/weapons/Taser.ogg'
|
||||
iconholder = 1
|
||||
icon_color = "green"
|
||||
|
||||
var/list/turret_icons
|
||||
|
||||
/obj/machinery/porta_turret/update_icon()
|
||||
@@ -164,7 +181,7 @@ var/list/turret_icons
|
||||
if(powered() && enabled)
|
||||
if(iconholder)
|
||||
//lasers have a orange icon
|
||||
icon_state = "orange_target_prism"
|
||||
icon_state = "[icon_color]_target_prism"
|
||||
else
|
||||
//almost everything has a blue icon
|
||||
icon_state = "target_prism"
|
||||
@@ -410,6 +427,11 @@ var/list/turret_icons
|
||||
|
||||
..()
|
||||
|
||||
/obj/machinery/porta_turret/ai_defense/emp_act(severity)
|
||||
if(prob(33)) // One in three chance to resist an EMP. This is significant if an AoE EMP is involved against multiple turrets.
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/machinery/porta_turret/ex_act(severity)
|
||||
switch (severity)
|
||||
if (1)
|
||||
@@ -449,6 +471,8 @@ var/list/turret_icons
|
||||
|
||||
if(!tryToShootAt(targets))
|
||||
if(!tryToShootAt(secondarytargets)) // if no valid targets, go for secondary targets
|
||||
timeout--
|
||||
if(timeout <= 0)
|
||||
spawn()
|
||||
popDown() // no valid targets, close the cover
|
||||
|
||||
@@ -552,6 +576,7 @@ var/list/turret_icons
|
||||
|
||||
set_raised_raising(1, 0)
|
||||
update_icon()
|
||||
timeout = 10
|
||||
|
||||
/obj/machinery/porta_turret/proc/popDown() //pops the turret down
|
||||
last_target = null
|
||||
@@ -572,6 +597,7 @@ var/list/turret_icons
|
||||
|
||||
set_raised_raising(0, 0)
|
||||
update_icon()
|
||||
timeout = 10
|
||||
|
||||
/obj/machinery/porta_turret/proc/set_raised_raising(var/raised, var/raising)
|
||||
src.raised = raised
|
||||
@@ -634,6 +660,9 @@ var/list/turret_icons
|
||||
//Shooting Code:
|
||||
A.launch(target, def_zone)
|
||||
|
||||
// Reset the time needed to go back down, since we just tried to shoot at someone.
|
||||
timeout = 10
|
||||
|
||||
/datum/turret_checks
|
||||
var/enabled
|
||||
var/lethal
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
var/list/nanoui_items // List of items for NanoUI use
|
||||
var/nanoui_menu = 0 // The current menu we are in
|
||||
var/list/nanoui_data = new // Additional data for NanoUI use
|
||||
var/faction = "" //Antag faction holder.
|
||||
|
||||
var/list/purchase_log = new
|
||||
var/datum/mind/uplink_owner = null
|
||||
@@ -96,6 +97,9 @@
|
||||
var/title = "Remote Uplink"
|
||||
var/data[0]
|
||||
uses = user.mind.tcrystals
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
faction = H.antag_faction
|
||||
|
||||
data["welcome"] = welcome
|
||||
data["crystals"] = uses
|
||||
@@ -188,7 +192,10 @@
|
||||
nanoui_data["exploit"]["faction"] = html_encode(L.fields["faction"])
|
||||
nanoui_data["exploit"]["religion"] = html_encode(L.fields["religion"])
|
||||
nanoui_data["exploit"]["fingerprint"] = html_encode(L.fields["fingerprint"])
|
||||
|
||||
if(L.fields["antagvis"] == ANTAG_KNOWN || (faction == L.fields["antagfac"] && (L.fields["antagvis"] == ANTAG_SHARED)))
|
||||
nanoui_data["exploit"]["antagfaction"] = html_encode(L.fields["antagfac"])
|
||||
else
|
||||
nanoui_data["exploit"]["antagfaction"] = html_encode("None")
|
||||
nanoui_data["exploit_exists"] = 1
|
||||
break
|
||||
|
||||
|
||||
@@ -298,7 +298,9 @@
|
||||
|
||||
/obj/item/stack/attack_hand(mob/user as mob)
|
||||
if (user.get_inactive_hand() == src)
|
||||
var/obj/item/stack/F = src.split(1)
|
||||
var/N = input("How many stacks of [src] would you like to split off?", "Split stacks", 1) as num|null
|
||||
if(N)
|
||||
var/obj/item/stack/F = src.split(N)
|
||||
if (F)
|
||||
user.put_in_hands(F)
|
||||
src.add_fingerprint(user)
|
||||
@@ -313,9 +315,6 @@
|
||||
/obj/item/stack/attackby(obj/item/W as obj, mob/user as mob)
|
||||
if (istype(W, /obj/item/stack))
|
||||
var/obj/item/stack/S = W
|
||||
if (user.get_inactive_hand()==src)
|
||||
src.transfer_to(S, 1)
|
||||
else
|
||||
src.transfer_to(S)
|
||||
|
||||
spawn(0) //give the stacks a chance to delete themselves if necessary
|
||||
|
||||
@@ -351,3 +351,10 @@
|
||||
icon_state = "civGold"
|
||||
primary_color = rgb(0,94,142)
|
||||
secondary_color = rgb(255,223,127)
|
||||
|
||||
/obj/item/weapon/card/id/external
|
||||
name = "identification card"
|
||||
desc = "An identification card of some sort. It does not look like it is issued by NT."
|
||||
icon_state = "permit"
|
||||
primary_color = rgb(142,94,0)
|
||||
secondary_color = rgb(191,159,95)
|
||||
@@ -10,12 +10,42 @@
|
||||
/obj/item/weapon/dice/New()
|
||||
icon_state = "[name][rand(1,sides)]"
|
||||
|
||||
/obj/item/weapon/dice/d4
|
||||
name = "d4"
|
||||
desc = "A dice with four sides."
|
||||
icon_state = "d44"
|
||||
sides = 4
|
||||
|
||||
/obj/item/weapon/dice/d8
|
||||
name = "d8"
|
||||
desc = "A dice with eight sides."
|
||||
icon_state = "d88"
|
||||
sides = 8
|
||||
|
||||
/obj/item/weapon/dice/d10
|
||||
name = "d10"
|
||||
desc = "A dice with ten sides."
|
||||
icon_state = "d1010"
|
||||
sides = 10
|
||||
|
||||
/obj/item/weapon/dice/d12
|
||||
name = "d12"
|
||||
desc = "A dice with twelve sides."
|
||||
icon_state = "d1212"
|
||||
sides = 12
|
||||
|
||||
/obj/item/weapon/dice/d20
|
||||
name = "d20"
|
||||
desc = "A dice with twenty sides."
|
||||
icon_state = "d2020"
|
||||
sides = 20
|
||||
|
||||
/obj/item/weapon/dice/d100
|
||||
name = "d100"
|
||||
desc = "A dice with ten sides. This one is for the tens digit."
|
||||
icon_state = "d10010"
|
||||
sides = 10
|
||||
|
||||
/obj/item/weapon/dice/attack_self(mob/user as mob)
|
||||
var/result = rand(1, sides)
|
||||
var/comment = ""
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
user << "<span class='danger'>\The [H] needs at least two wrists before you can cuff them together!</span>"
|
||||
return 0
|
||||
|
||||
if(istype(H.gloves,/obj/item/clothing/gloves/rig) && !elastic) // Can't cuff someone who's in a deployed hardsuit.
|
||||
if(istype(H.gloves,/obj/item/clothing/gloves/gauntlets/rig) && !elastic) // Can't cuff someone who's in a deployed hardsuit.
|
||||
user << "<span class='danger'>\The [src] won't fit around \the [H.gloves]!</span>"
|
||||
return 0
|
||||
|
||||
|
||||
@@ -15,28 +15,29 @@
|
||||
var/malfunction = 0
|
||||
show_messages = 1
|
||||
|
||||
proc/trigger(emote, source as mob)
|
||||
/obj/item/weapon/implant/proc/trigger(emote, source as mob)
|
||||
return
|
||||
|
||||
proc/activate()
|
||||
/obj/item/weapon/implant/proc/activate()
|
||||
return
|
||||
|
||||
// What does the implant do upon injection?
|
||||
// return 0 if the implant fails (ex. Revhead and loyalty implant.)
|
||||
// return 1 if the implant succeeds (ex. Nonrevhead and loyalty implant.)
|
||||
proc/implanted(var/mob/source)
|
||||
/obj/item/weapon/implant/proc/implanted(var/mob/source)
|
||||
listening_objects |= src
|
||||
return 1
|
||||
|
||||
proc/get_data()
|
||||
/obj/item/weapon/implant/proc/get_data()
|
||||
return "No information available"
|
||||
|
||||
proc/hear(message, source as mob)
|
||||
/obj/item/weapon/implant/proc/hear(message, source as mob)
|
||||
return
|
||||
|
||||
proc/islegal()
|
||||
/obj/item/weapon/implant/proc/islegal()
|
||||
return 0
|
||||
|
||||
proc/meltdown() //breaks it down, making implant unrecongizible
|
||||
/obj/item/weapon/implant/proc/meltdown() //breaks it down, making implant unrecongizible
|
||||
imp_in << "<span class='warning'>You feel something melting inside [part ? "your [part.name]" : "you"]!</span>"
|
||||
if (part)
|
||||
part.take_damage(burn = 15, used_weapon = "Electronics meltdown")
|
||||
@@ -48,7 +49,7 @@
|
||||
icon_state = "implant_melted"
|
||||
malfunction = MALFUNCTION_PERMANENT
|
||||
|
||||
Destroy()
|
||||
/obj/item/weapon/implant/Destroy()
|
||||
if(part)
|
||||
part.implants.Remove(src)
|
||||
..()
|
||||
@@ -59,7 +60,7 @@
|
||||
var/id = 1.0
|
||||
|
||||
|
||||
get_data()
|
||||
/obj/item/weapon/implant/tracking/get_data()
|
||||
var/dat = {"<b>Implant Specifications:</b><BR>
|
||||
<b>Name:</b> Tracking Beacon<BR>
|
||||
<b>Life:</b> 10 minutes after death of host<BR>
|
||||
@@ -76,7 +77,7 @@ circuitry. As a result neurotoxins can cause massive damage.<HR>
|
||||
Implant Specifics:<BR>"}
|
||||
return dat
|
||||
|
||||
emp_act(severity)
|
||||
/obj/item/weapon/implant/tracking/emp_act(severity)
|
||||
if (malfunction) //no, dawg, you can't malfunction while you are malfunctioning
|
||||
return
|
||||
malfunction = MALFUNCTION_TEMPORARY
|
||||
@@ -98,7 +99,7 @@ Implant Specifics:<BR>"}
|
||||
desc = "And boom goes the weasel."
|
||||
icon_state = "implant_evil"
|
||||
|
||||
get_data()
|
||||
/obj/item/weapon/implant/dexplosive/get_data()
|
||||
var/dat = {"
|
||||
<b>Implant Specifications:</b><BR>
|
||||
<b>Name:</b> Robust Corp RX-78 Employee Management Implant<BR>
|
||||
@@ -112,19 +113,19 @@ Implant Specifics:<BR>"}
|
||||
return dat
|
||||
|
||||
|
||||
trigger(emote, source as mob)
|
||||
/obj/item/weapon/implant/dexplosive/trigger(emote, source as mob)
|
||||
if(emote == "deathgasp")
|
||||
src.activate("death")
|
||||
return
|
||||
|
||||
|
||||
activate(var/cause)
|
||||
/obj/item/weapon/implant/dexplosive/activate(var/cause)
|
||||
if((!cause) || (!src.imp_in)) return 0
|
||||
explosion(src, -1, 0, 2, 3, 0)//This might be a bit much, dono will have to see.
|
||||
if(src.imp_in)
|
||||
src.imp_in.gib()
|
||||
|
||||
islegal()
|
||||
/obj/item/weapon/implant/dexplosive/islegal()
|
||||
return 0
|
||||
|
||||
//BS12 Explosive
|
||||
@@ -135,7 +136,7 @@ Implant Specifics:<BR>"}
|
||||
var/phrase = "supercalifragilisticexpialidocious"
|
||||
icon_state = "implant_evil"
|
||||
|
||||
get_data()
|
||||
/obj/item/weapon/implant/explosive/get_data()
|
||||
var/dat = {"
|
||||
<b>Implant Specifications:</b><BR>
|
||||
<b>Name:</b> Robust Corp RX-78 Intimidation Class Implant<BR>
|
||||
@@ -148,18 +149,18 @@ Implant Specifics:<BR>"}
|
||||
<b>Integrity:</b> Implant will occasionally be degraded by the body's immune system and thus will occasionally malfunction."}
|
||||
return dat
|
||||
|
||||
hear_talk(mob/M as mob, msg)
|
||||
/obj/item/weapon/implant/explosive/hear_talk(mob/M as mob, msg)
|
||||
hear(msg)
|
||||
return
|
||||
|
||||
hear(var/msg)
|
||||
/obj/item/weapon/implant/explosive/hear(var/msg)
|
||||
var/list/replacechars = list("'" = "","\"" = "",">" = "","<" = "","(" = "",")" = "")
|
||||
msg = replace_characters(msg, replacechars)
|
||||
if(findtext(msg,phrase))
|
||||
activate()
|
||||
qdel(src)
|
||||
|
||||
activate()
|
||||
/obj/item/weapon/implant/explosive/activate()
|
||||
if (malfunction == MALFUNCTION_PERMANENT)
|
||||
return
|
||||
|
||||
@@ -204,16 +205,17 @@ Implant Specifics:<BR>"}
|
||||
if(t)
|
||||
t.hotspot_expose(3500,125)
|
||||
|
||||
implanted(mob/source as mob)
|
||||
/obj/item/weapon/implant/explosive/implanted(mob/source as mob)
|
||||
elevel = alert("What sort of explosion would you prefer?", "Implant Intent", "Localized Limb", "Destroy Body", "Full Explosion")
|
||||
phrase = input("Choose activation phrase:") as text
|
||||
var/list/replacechars = list("'" = "","\"" = "",">" = "","<" = "","(" = "",")" = "")
|
||||
phrase = replace_characters(phrase, replacechars)
|
||||
usr.mind.store_memory("Explosive implant in [source] can be activated by saying something containing the phrase ''[src.phrase]'', <B>say [src.phrase]</B> to attempt to activate.", 0, 0)
|
||||
usr << "The implanted explosive implant in [source] can be activated by saying something containing the phrase ''[src.phrase]'', <B>say [src.phrase]</B> to attempt to activate."
|
||||
listening_objects |= src
|
||||
return 1
|
||||
|
||||
emp_act(severity)
|
||||
/obj/item/weapon/implant/explosive/emp_act(severity)
|
||||
if (malfunction)
|
||||
return
|
||||
malfunction = MALFUNCTION_TEMPORARY
|
||||
@@ -233,10 +235,10 @@ Implant Specifics:<BR>"}
|
||||
spawn (20)
|
||||
malfunction--
|
||||
|
||||
islegal()
|
||||
/obj/item/weapon/implant/explosive/islegal()
|
||||
return 0
|
||||
|
||||
proc/small_boom()
|
||||
/obj/item/weapon/implant/explosive/proc/small_boom()
|
||||
if (ishuman(imp_in) && part)
|
||||
imp_in.visible_message("<span class='warning'>Something beeps inside [imp_in][part ? "'s [part.name]" : ""]!</span>")
|
||||
playsound(loc, 'sound/items/countdown.ogg', 75, 1, -3)
|
||||
@@ -258,7 +260,7 @@ Implant Specifics:<BR>"}
|
||||
desc = "Injects things."
|
||||
allow_reagents = 1
|
||||
|
||||
get_data()
|
||||
/obj/item/weapon/implant/chem/get_data()
|
||||
var/dat = {"
|
||||
<b>Implant Specifications:</b><BR>
|
||||
<b>Name:</b> Robust Corp MJ-420 Prisoner Management Implant<BR>
|
||||
@@ -277,20 +279,20 @@ the implant may become unstable and either pre-maturely inject the subject or si
|
||||
return dat
|
||||
|
||||
|
||||
New()
|
||||
/obj/item/weapon/implant/chem/New()
|
||||
..()
|
||||
var/datum/reagents/R = new/datum/reagents(50)
|
||||
reagents = R
|
||||
R.my_atom = src
|
||||
|
||||
|
||||
trigger(emote, source as mob)
|
||||
/obj/item/weapon/implant/chem/trigger(emote, source as mob)
|
||||
if(emote == "deathgasp")
|
||||
src.activate(src.reagents.total_volume)
|
||||
return
|
||||
|
||||
|
||||
activate(var/cause)
|
||||
/obj/item/weapon/implant/chem/activate(var/cause)
|
||||
if((!cause) || (!src.imp_in)) return 0
|
||||
var/mob/living/carbon/R = src.imp_in
|
||||
src.reagents.trans_to_mob(R, cause, CHEM_BLOOD)
|
||||
@@ -301,7 +303,7 @@ the implant may become unstable and either pre-maturely inject the subject or si
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
emp_act(severity)
|
||||
/obj/item/weapon/implant/chem/emp_act(severity)
|
||||
if (malfunction)
|
||||
return
|
||||
malfunction = MALFUNCTION_TEMPORARY
|
||||
@@ -321,7 +323,7 @@ the implant may become unstable and either pre-maturely inject the subject or si
|
||||
name = "loyalty implant"
|
||||
desc = "Makes you loyal or such."
|
||||
|
||||
get_data()
|
||||
/obj/item/weapon/implant/loyalty/get_data()
|
||||
var/dat = {"
|
||||
<b>Implant Specifications:</b><BR>
|
||||
<b>Name:</b> [company_name] Employee Management Implant<BR>
|
||||
@@ -335,7 +337,7 @@ the implant may become unstable and either pre-maturely inject the subject or si
|
||||
return dat
|
||||
|
||||
|
||||
implanted(mob/M)
|
||||
/obj/item/weapon/implant/loyalty/implanted(mob/M)
|
||||
if(!istype(M, /mob/living/carbon/human)) return 0
|
||||
var/mob/living/carbon/human/H = M
|
||||
var/datum/antagonist/antag_data = get_antag_data(H.mind.special_role)
|
||||
@@ -353,7 +355,7 @@ the implant may become unstable and either pre-maturely inject the subject or si
|
||||
desc = "Removes all stuns and knockdowns."
|
||||
var/uses
|
||||
|
||||
get_data()
|
||||
/obj/item/weapon/implant/adrenalin/get_data()
|
||||
var/dat = {"
|
||||
<b>Implant Specifications:</b><BR>
|
||||
<b>Name:</b> Cybersun Industries Adrenalin Implant<BR>
|
||||
@@ -367,7 +369,7 @@ the implant may become unstable and either pre-maturely inject the subject or si
|
||||
return dat
|
||||
|
||||
|
||||
trigger(emote, mob/source as mob)
|
||||
/obj/item/weapon/implant/adrenalin/trigger(emote, mob/source as mob)
|
||||
if (src.uses < 1) return 0
|
||||
if (emote == "pale")
|
||||
src.uses--
|
||||
@@ -379,9 +381,10 @@ the implant may become unstable and either pre-maturely inject the subject or si
|
||||
return
|
||||
|
||||
|
||||
implanted(mob/source)
|
||||
/obj/item/weapon/implant/adrenalin/implanted(mob/source)
|
||||
source.mind.store_memory("A implant can be activated by using the pale emote, <B>say *pale</B> to attempt to activate.", 0, 0)
|
||||
source << "The implanted freedom implant can be activated by using the pale emote, <B>say *pale</B> to attempt to activate."
|
||||
listening_objects |= src
|
||||
return 1
|
||||
|
||||
|
||||
@@ -390,7 +393,7 @@ the implant may become unstable and either pre-maturely inject the subject or si
|
||||
desc = "An alarm which monitors host vital signs and transmits a radio message upon death."
|
||||
var/mobname = "Will Robinson"
|
||||
|
||||
get_data()
|
||||
/obj/item/weapon/implant/death_alarm/get_data()
|
||||
var/dat = {"
|
||||
<b>Implant Specifications:</b><BR>
|
||||
<b>Name:</b> [company_name] \"Profit Margin\" Class Employee Lifesign Sensor<BR>
|
||||
@@ -403,7 +406,7 @@ the implant may become unstable and either pre-maturely inject the subject or si
|
||||
<b>Integrity:</b> Implant will occasionally be degraded by the body's immune system and thus will occasionally malfunction."}
|
||||
return dat
|
||||
|
||||
process()
|
||||
/obj/item/weapon/implant/death_alarm/process()
|
||||
if (!implanted) return
|
||||
var/mob/M = imp_in
|
||||
|
||||
@@ -412,7 +415,7 @@ the implant may become unstable and either pre-maturely inject the subject or si
|
||||
else if(M.stat == 2)
|
||||
activate("death")
|
||||
|
||||
activate(var/cause)
|
||||
/obj/item/weapon/implant/death_alarm/activate(var/cause)
|
||||
var/mob/M = imp_in
|
||||
var/area/t = get_area(M)
|
||||
switch (cause)
|
||||
@@ -440,7 +443,7 @@ the implant may become unstable and either pre-maturely inject the subject or si
|
||||
qdel(a)
|
||||
processing_objects.Remove(src)
|
||||
|
||||
emp_act(severity) //for some reason alarms stop going off in case they are emp'd, even without this
|
||||
/obj/item/weapon/implant/death_alarm/emp_act(severity) //for some reason alarms stop going off in case they are emp'd, even without this
|
||||
if (malfunction) //so I'm just going to add a meltdown chance here
|
||||
return
|
||||
malfunction = MALFUNCTION_TEMPORARY
|
||||
@@ -456,7 +459,7 @@ the implant may become unstable and either pre-maturely inject the subject or si
|
||||
spawn(20)
|
||||
malfunction--
|
||||
|
||||
implanted(mob/source as mob)
|
||||
/obj/item/weapon/implant/death_alarm/implanted(mob/source as mob)
|
||||
mobname = source.real_name
|
||||
processing_objects.Add(src)
|
||||
return 1
|
||||
@@ -468,7 +471,7 @@ the implant may become unstable and either pre-maturely inject the subject or si
|
||||
var/activation_emote = "sigh"
|
||||
var/obj/item/scanned = null
|
||||
|
||||
get_data()
|
||||
/obj/item/weapon/implant/compressed/get_data()
|
||||
var/dat = {"
|
||||
<b>Implant Specifications:</b><BR>
|
||||
<b>Name:</b> [company_name] \"Profit Margin\" Class Employee Lifesign Sensor<BR>
|
||||
@@ -481,7 +484,7 @@ the implant may become unstable and either pre-maturely inject the subject or si
|
||||
<b>Integrity:</b> Implant will occasionally be degraded by the body's immune system and thus will occasionally malfunction."}
|
||||
return dat
|
||||
|
||||
trigger(emote, mob/source as mob)
|
||||
/obj/item/weapon/implant/compressed/trigger(emote, mob/source as mob)
|
||||
if (src.scanned == null)
|
||||
return 0
|
||||
|
||||
@@ -489,7 +492,7 @@ the implant may become unstable and either pre-maturely inject the subject or si
|
||||
source << "The air glows as \the [src.scanned.name] uncompresses."
|
||||
activate()
|
||||
|
||||
activate()
|
||||
/obj/item/weapon/implant/compressed/activate()
|
||||
var/turf/t = get_turf(src)
|
||||
if (imp_in)
|
||||
imp_in.put_in_hands(scanned)
|
||||
@@ -497,12 +500,13 @@ the implant may become unstable and either pre-maturely inject the subject or si
|
||||
scanned.loc = t
|
||||
qdel(src)
|
||||
|
||||
implanted(mob/source as mob)
|
||||
/obj/item/weapon/implant/compressed/implanted(mob/source as mob)
|
||||
src.activation_emote = input("Choose activation emote:") in list("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink")
|
||||
if (source.mind)
|
||||
source.mind.store_memory("Compressed matter implant can be activated by using the [src.activation_emote] emote, <B>say *[src.activation_emote]</B> to attempt to activate.", 0, 0)
|
||||
source << "The implanted compressed matter implant can be activated by using the [src.activation_emote] emote, <B>say *[src.activation_emote]</B> to attempt to activate."
|
||||
listening_objects |= src
|
||||
return 1
|
||||
|
||||
islegal()
|
||||
/obj/item/weapon/implant/compressed/islegal()
|
||||
return 0
|
||||
|
||||
@@ -8,14 +8,14 @@
|
||||
var/uses = 1.0
|
||||
|
||||
|
||||
New()
|
||||
/obj/item/weapon/implant/freedom/New()
|
||||
src.activation_emote = pick("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink")
|
||||
src.uses = rand(1, 5)
|
||||
..()
|
||||
return
|
||||
|
||||
|
||||
trigger(emote, mob/living/carbon/source as mob)
|
||||
/obj/item/weapon/implant/freedom/trigger(emote, mob/living/carbon/source as mob)
|
||||
if (src.uses < 1) return 0
|
||||
if (emote == src.activation_emote)
|
||||
src.uses--
|
||||
@@ -47,13 +47,14 @@
|
||||
return
|
||||
|
||||
|
||||
implanted(mob/living/carbon/source)
|
||||
/obj/item/weapon/implant/freedom/implanted(mob/living/carbon/source)
|
||||
source.mind.store_memory("Freedom implant can be activated by using the [src.activation_emote] emote, <B>say *[src.activation_emote]</B> to attempt to activate.", 0, 0)
|
||||
source << "The implanted freedom implant can be activated by using the [src.activation_emote] emote, <B>say *[src.activation_emote]</B> to attempt to activate."
|
||||
listening_objects |= src
|
||||
return 1
|
||||
|
||||
|
||||
get_data()
|
||||
/obj/item/weapon/implant/freedom/get_data()
|
||||
var/dat = {"
|
||||
<b>Implant Specifications:</b><BR>
|
||||
<b>Name:</b> Freedom Beacon<BR>
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
activation_emote = input("Choose activation emote:") in list("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink")
|
||||
source.mind.store_memory("Uplink implant can be activated by using the [src.activation_emote] emote, <B>say *[src.activation_emote]</B> to attempt to activate.", 0, 0)
|
||||
source << "The implanted uplink implant can be activated by using the [src.activation_emote] emote, <B>say *[src.activation_emote]</B> to attempt to activate."
|
||||
listening_objects |= src
|
||||
return 1
|
||||
|
||||
|
||||
|
||||
@@ -1,11 +1,29 @@
|
||||
/obj/item/weapon/storage/pill_bottle/dice
|
||||
name = "pack of dice"
|
||||
desc = "It's a small container with dice inside."
|
||||
/obj/item/weapon/storage/pill_bottle/dice //7d6
|
||||
name = "bag of dice"
|
||||
desc = "It's a small bag with dice inside."
|
||||
icon = 'icons/obj/dice.dmi'
|
||||
icon_state = "dicebag"
|
||||
|
||||
New()
|
||||
/obj/item/weapon/storage/pill_bottle/dice/New()
|
||||
..()
|
||||
for(var/i = 1 to 7)
|
||||
new /obj/item/weapon/dice( src )
|
||||
|
||||
/obj/item/weapon/storage/pill_bottle/dice_nerd //DnD dice
|
||||
name = "bag of gaming dice"
|
||||
desc = "It's a small bag with gaming dice inside."
|
||||
icon = 'icons/obj/dice.dmi'
|
||||
icon_state = "magicdicebag"
|
||||
|
||||
/obj/item/weapon/storage/pill_bottle/dice_nerd/New()
|
||||
..()
|
||||
new /obj/item/weapon/dice/d4( src )
|
||||
new /obj/item/weapon/dice( src )
|
||||
new /obj/item/weapon/dice/d8( src )
|
||||
new /obj/item/weapon/dice/d10( src )
|
||||
new /obj/item/weapon/dice/d12( src )
|
||||
new /obj/item/weapon/dice/d20( src )
|
||||
new /obj/item/weapon/dice/d100( src )
|
||||
|
||||
/*
|
||||
* Donut Box
|
||||
|
||||
69
code/game/trader_visit.dm
Normal file
69
code/game/trader_visit.dm
Normal file
@@ -0,0 +1,69 @@
|
||||
//Based on the ERT setup
|
||||
|
||||
var/global/send_beruang = 0
|
||||
var/can_call_traders = 1
|
||||
|
||||
/client/proc/trader_ship()
|
||||
set name = "Dispatch Beruang Trader Ship"
|
||||
set category = "Special Verbs"
|
||||
set desc = "Invite players to join the Beruang."
|
||||
|
||||
if(!holder)
|
||||
usr << "<span class='danger'>Only administrators may use this command.</span>"
|
||||
return
|
||||
if(!ticker)
|
||||
usr << "<span class='danger'>The game hasn't started yet!</span>"
|
||||
return
|
||||
if(ticker.current_state == 1)
|
||||
usr << "<span class='danger'>The round hasn't started yet!</span>"
|
||||
return
|
||||
if(send_beruang)
|
||||
usr << "<span class='danger'>The Beruang has already been sent this round!</span>"
|
||||
return
|
||||
if(alert("Do you want to dispatch the Beruang trade ship?",,"Yes","No") != "Yes")
|
||||
return
|
||||
if(get_security_level() == "red") // Allow admins to reconsider if the alert level is Red
|
||||
switch(alert("The station is in red alert. Do you still want to send traders?",,"Yes","No"))
|
||||
if("No")
|
||||
return
|
||||
if(send_beruang)
|
||||
usr << "<span class='danger'>Looks like somebody beat you to it!</span>"
|
||||
return
|
||||
|
||||
message_admins("[key_name_admin(usr)] is dispatching the Beruang.", 1)
|
||||
log_admin("[key_name(usr)] used Dispatch Beruang Trader Ship.")
|
||||
trigger_trader_visit()
|
||||
|
||||
client/verb/JoinTraders()
|
||||
|
||||
set name = "Join Trader Visit"
|
||||
set category = "IC"
|
||||
|
||||
if(!MayRespawn(1))
|
||||
usr << "<span class='warning'>You cannot join the traders.</span>"
|
||||
return
|
||||
|
||||
if(istype(usr,/mob/observer/dead) || istype(usr,/mob/new_player))
|
||||
if(!send_beruang)
|
||||
usr << "The Beruang is not currently heading to the station."
|
||||
return
|
||||
if(traders.current_antagonists.len >= traders.hard_cap)
|
||||
usr << "The number of trader slots is already full!"
|
||||
return
|
||||
traders.create_default(usr)
|
||||
else
|
||||
usr << "You need to be an observer or new player to use this."
|
||||
|
||||
proc/trigger_trader_visit()
|
||||
if(!can_call_traders)
|
||||
return
|
||||
if(send_beruang)
|
||||
return
|
||||
|
||||
command_announcement.Announce("Incoming cargo hauler: Beruang (Reg: VRS 22EB1F11C2).", "[station_name()] Traffic Control")
|
||||
|
||||
can_call_traders = 0 // Only one call per round.
|
||||
send_beruang = 1
|
||||
|
||||
sleep(600 * 5)
|
||||
send_beruang = 0 // Can no longer join the traders.
|
||||
@@ -43,3 +43,6 @@
|
||||
return
|
||||
/turf/simulated/wall/titanium/New(var/newloc)
|
||||
..(newloc,"titanium")
|
||||
|
||||
/turf/simulated/wall/durasteel/New(var/newloc)
|
||||
..(newloc,"durasteel", "durasteel")
|
||||
@@ -59,6 +59,26 @@
|
||||
//cap the amount of damage, so that things like emitters can't destroy walls in one hit.
|
||||
var/damage = min(proj_damage, 100)
|
||||
|
||||
if(istype(Proj,/obj/item/projectile/beam))
|
||||
if(material && material.reflectivity >= 0.5) // Time to reflect lasers.
|
||||
var/new_damage = damage * material.reflectivity
|
||||
var/outgoing_damage = damage - new_damage
|
||||
damage = new_damage
|
||||
Proj.damage = outgoing_damage
|
||||
|
||||
visible_message("<span class='danger'>\The [src] reflects \the [Proj]!</span>")
|
||||
|
||||
// Find a turf near or on the original location to bounce to
|
||||
var/new_x = Proj.starting.x + pick(0, 0, 0, -1, 1, -2, 2)
|
||||
var/new_y = Proj.starting.y + pick(0, 0, 0, -1, 1, -2, 2)
|
||||
//var/turf/curloc = get_turf(src)
|
||||
var/turf/curloc = get_step(src, get_dir(src, Proj.starting))
|
||||
|
||||
Proj.penetrating += 1 // Needed for the beam to get out of the wall.
|
||||
|
||||
// redirect the projectile
|
||||
Proj.redirect(new_x, new_y, curloc, null)
|
||||
|
||||
take_damage(damage)
|
||||
return
|
||||
|
||||
|
||||
47
code/game/turfs/unsimulated/planetary.dm
Normal file
47
code/game/turfs/unsimulated/planetary.dm
Normal file
@@ -0,0 +1,47 @@
|
||||
// This is a wall you surround the area of your "planet" with, that makes the atmosphere inside stay within bounds, even if canisters
|
||||
// are opened or other strange things occur.
|
||||
/turf/unsimulated/wall/planetary
|
||||
name = "railroading"
|
||||
desc = "Choo choo!"
|
||||
icon = 'icons/turf/walls.dmi'
|
||||
icon_state = "riveted"
|
||||
opacity = 1
|
||||
density = 1
|
||||
alpha = 0
|
||||
blocks_air = 0
|
||||
|
||||
// Set these to get your desired planetary atmosphere.
|
||||
oxygen = 0
|
||||
nitrogen = 0
|
||||
carbon_dioxide = 0
|
||||
phoron = 0
|
||||
temperature = T20C
|
||||
|
||||
// Normal station/earth air.
|
||||
/turf/unsimulated/wall/planetary/normal
|
||||
oxygen = MOLES_O2STANDARD
|
||||
nitrogen = MOLES_N2STANDARD
|
||||
|
||||
/turf/unsimulated/wall/planetary/firnir
|
||||
temperature = 570
|
||||
carbon_dioxide = 0.04863
|
||||
|
||||
/turf/unsimulated/wall/planetary/tyr
|
||||
temperature = 405
|
||||
carbon_dioxide = 0.15848
|
||||
|
||||
// Wiki says it's 92.6 kPa, composition 18.1% O2 80.8% N2 1.1% trace. We're gonna pretend trace is actually nitrogen.
|
||||
/turf/unsimulated/wall/planetary/sif
|
||||
oxygen = 114.50978 * 0.181
|
||||
nitrogen = 114.50978 * 0.819
|
||||
temperature = 243.15 // Roughly -30C / -22F
|
||||
|
||||
// Fairly close to Mars in terms of temperature and pressure.
|
||||
/turf/unsimulated/wall/planetary/magni
|
||||
carbon_dioxide = 0.90998361
|
||||
temperature = 202
|
||||
|
||||
/turf/unsimulated/wall/planetary/desert
|
||||
oxygen = MOLES_O2STANDARD
|
||||
nitrogen = MOLES_N2STANDARD
|
||||
temperature = 310.92 // About 37.7C / 100F
|
||||
@@ -69,9 +69,11 @@
|
||||
|
||||
var/msg = ""
|
||||
var/modmsg = ""
|
||||
var/devmsg = ""
|
||||
var/mentmsg = ""
|
||||
var/num_mods_online = 0
|
||||
var/num_admins_online = 0
|
||||
var/num_devs_online = 0
|
||||
var/num_mentors_online = 0
|
||||
if(holder)
|
||||
for(var/client/C in admins)
|
||||
@@ -118,6 +120,23 @@
|
||||
modmsg += "\n"
|
||||
num_mods_online++
|
||||
|
||||
else if(R_SERVER & C.holder.rights)
|
||||
devmsg += "\t[C] is a [C.holder.rank]"
|
||||
if(isobserver(C.mob))
|
||||
devmsg += " - Observing"
|
||||
else if(istype(C.mob,/mob/new_player))
|
||||
devmsg += " - Lobby"
|
||||
else
|
||||
devmsg += " - Playing"
|
||||
|
||||
if(C.is_afk())
|
||||
var/seconds = C.last_activity_seconds()
|
||||
devmsg += "(AFK - "
|
||||
devmsg += "[round(seconds / 60)] minutes, "
|
||||
devmsg += "[seconds % 60] seconds)"
|
||||
devmsg += "\n"
|
||||
num_devs_online++
|
||||
|
||||
else if(R_MENTOR & C.holder.rights)
|
||||
mentmsg += "\t[C] is a [C.holder.rank]"
|
||||
if(isobserver(C.mob))
|
||||
@@ -144,6 +163,9 @@
|
||||
else if (R_MOD & C.holder.rights)
|
||||
modmsg += "\t[C] is a [C.holder.rank]\n"
|
||||
num_mods_online++
|
||||
else if (R_SERVER & C.holder.rights)
|
||||
devmsg += "\t[C] is a [C.holder.rank]\n"
|
||||
num_devs_online++
|
||||
else if (R_MENTOR & C.holder.rights)
|
||||
mentmsg += "\t[C] is a [C.holder.rank]\n"
|
||||
num_mentors_online++
|
||||
@@ -155,6 +177,9 @@
|
||||
if(config.show_mods)
|
||||
msg += "\n<b> Current Moderators ([num_mods_online]):</b>\n" + modmsg
|
||||
|
||||
if(config.show_devs)
|
||||
msg += "\n<b> Current Developers ([num_devs_online]):</b>\n" + devmsg
|
||||
|
||||
if(config.show_mentors)
|
||||
msg += "\n<b> Current Mentors ([num_mentors_online]):</b>\n" + mentmsg
|
||||
|
||||
|
||||
@@ -80,6 +80,7 @@ var/list/admin_verbs_admin = list(
|
||||
/client/proc/man_up,
|
||||
/client/proc/global_man_up,
|
||||
/client/proc/response_team, // Response Teams admin verb,
|
||||
/client/proc/trader_ship, // Trader ship admin verb,
|
||||
/client/proc/toggle_antagHUD_use,
|
||||
/client/proc/toggle_antagHUD_restrictions,
|
||||
/client/proc/allow_character_respawn, // Allows a ghost to respawn ,
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
src << "Only administrators may use this command."
|
||||
return
|
||||
|
||||
var/input = sanitize(input(usr, "Enter the description of the custom event. Be descriptive. To cancel the event, make this blank or hit cancel.", "Custom Event", custom_event_msg) as message|null, MAX_BOOK_MESSAGE_LEN, extra = 0)
|
||||
var/input = sanitize(input(usr, "Enter the description of the custom event. Be descriptive. To cancel the event, make this blank or hit cancel.", "Custom Event", custom_event_msg) as message|null, MAX_PAPER_MESSAGE_LEN, extra = 0)
|
||||
if(!input || input == "")
|
||||
custom_event_msg = null
|
||||
log_admin("[usr.key] has cleared the custom event text.")
|
||||
|
||||
@@ -349,111 +349,146 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
/N */
|
||||
/client/proc/respawn_character()
|
||||
set category = "Special Verbs"
|
||||
set name = "Respawn Character"
|
||||
set desc = "Respawn a person that has been gibbed/dusted/killed. They must be a ghost for this to work and preferably should not have a body to go back into."
|
||||
set name = "Spawn Character"
|
||||
set desc = "(Re)Spawn a client's loaded character."
|
||||
if(!holder)
|
||||
src << "Only administrators may use this command."
|
||||
return
|
||||
var/input = ckey(input(src, "Please specify which key will be respawned.", "Key", ""))
|
||||
if(!input)
|
||||
|
||||
//I frontload all the questions so we don't have a half-done process while you're reading.
|
||||
var/client/picked_client = input(src, "Please specify which client's character to spawn.", "Client", "") as null|anything in clients
|
||||
if(!picked_client)
|
||||
return
|
||||
|
||||
var/mob/observer/dead/G_found
|
||||
for(var/mob/observer/dead/G in player_list)
|
||||
if(G.ckey == input)
|
||||
G_found = G
|
||||
break
|
||||
|
||||
if(!G_found)//If a ghost was not found.
|
||||
usr << "<font color='red'>There is no active key like that in the game or the person is not currently a ghost.</font>"
|
||||
var/location = alert(src,"Please specify where to spawn them.", "Location", "Right Here", "Arrivals", "Cancel")
|
||||
if(!location)
|
||||
return
|
||||
|
||||
var/mob/living/carbon/human/new_character = new(pick(latejoin))//The mob being spawned.
|
||||
|
||||
var/datum/data/record/record_found //Referenced to later to either randomize or not randomize the character.
|
||||
if(G_found.mind && !G_found.mind.active) //mind isn't currently in use by someone/something
|
||||
/*Try and locate a record for the person being respawned through data_core.
|
||||
This isn't an exact science but it does the trick more often than not.*/
|
||||
var/id = md5("[G_found.real_name][G_found.mind.assigned_role]")
|
||||
for(var/datum/data/record/t in data_core.locked)
|
||||
if(t.fields["id"]==id)
|
||||
record_found = t//We shall now reference the record.
|
||||
break
|
||||
|
||||
if(record_found)//If they have a record we can determine a few things.
|
||||
new_character.real_name = record_found.fields["name"]
|
||||
new_character.gender = record_found.fields["sex"]
|
||||
new_character.age = record_found.fields["age"]
|
||||
new_character.b_type = record_found.fields["b_type"]
|
||||
var/announce = alert(src,"Announce as if they had just arrived?", "Announce", "Yes", "No", "Cancel")
|
||||
if(announce == "Cancel")
|
||||
return
|
||||
else if(announce == "Yes") //Too bad buttons can't just have 1/0 values and different display strings
|
||||
announce = 1
|
||||
else
|
||||
new_character.gender = pick(MALE,FEMALE)
|
||||
var/datum/preferences/A = new()
|
||||
A.randomize_appearance_and_body_for(new_character)
|
||||
new_character.real_name = G_found.real_name
|
||||
announce = 0
|
||||
|
||||
if(!new_character.real_name)
|
||||
if(new_character.gender == MALE)
|
||||
new_character.real_name = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names))
|
||||
var/inhabit = alert(src,"Put the person into the spawned mob?", "Inhabit", "Yes", "No", "Cancel")
|
||||
if(inhabit == "Cancel")
|
||||
return
|
||||
else if(inhabit == "Yes")
|
||||
inhabit = 1
|
||||
else
|
||||
new_character.real_name = capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names))
|
||||
new_character.name = new_character.real_name
|
||||
inhabit = 0
|
||||
|
||||
if(G_found.mind && !G_found.mind.active)
|
||||
G_found.mind.transfer_to(new_character) //be careful when doing stuff like this! I've already checked the mind isn't in use
|
||||
new_character.mind.special_verbs = list()
|
||||
//Name matching is ugly but mind doesn't persist to look at.
|
||||
var/charjob
|
||||
var/records
|
||||
var/datum/data/record/record_found
|
||||
record_found = find_general_record("name",picked_client.prefs.real_name)
|
||||
|
||||
//Found their record, they were spawned previously
|
||||
if(record_found)
|
||||
var/samejob = alert(src,"Found [picked_client.prefs.real_name] in data core. They were [record_found.fields["real_rank"]] this round. Assign same job? They will not be re-added to the manifest/records, either way.","Previously spawned","Yes","Assistant","No")
|
||||
if(samejob == "Yes")
|
||||
charjob = record_found.fields["real_rank"]
|
||||
else if(samejob == "Assistant")
|
||||
charjob = "Assistant"
|
||||
else
|
||||
new_character.mind_initialize()
|
||||
if(!new_character.mind.assigned_role) new_character.mind.assigned_role = "Assistant"//If they somehow got a null assigned role.
|
||||
records = alert(src,"No data core entry detected. Would you like add them to the manifest, and sec/med/HR records?","Records","Yes","No","Cancel")
|
||||
if(records == "Cancel")
|
||||
return
|
||||
if(records == "Yes")
|
||||
records = 1
|
||||
else
|
||||
records = 0
|
||||
|
||||
//DNA
|
||||
if(record_found)//Pull up their name from database records if they did have a mind.
|
||||
new_character.dna = new()//Let's first give them a new DNA.
|
||||
new_character.dna.unique_enzymes = record_found.fields["b_dna"]//Enzymes are based on real name but we'll use the record for conformity.
|
||||
//Well you're not reloading their job or they never had one.
|
||||
if(!charjob)
|
||||
var/pickjob = input(src,"Pick a job to assign them (or none).","Job Select","-No Job-") as null|anything in joblist + "-No Job-"
|
||||
if(!pickjob)
|
||||
return
|
||||
if(pickjob != "-No Job-")
|
||||
charjob = pickjob
|
||||
|
||||
// I HATE BYOND. HATE. HATE. - N3X
|
||||
var/list/newSE= record_found.fields["enzymes"]
|
||||
var/list/newUI = record_found.fields["identity"]
|
||||
new_character.dna.SE = newSE.Copy() //This is the default of enzymes so I think it's safe to go with.
|
||||
new_character.dna.UpdateSE()
|
||||
new_character.UpdateAppearance(newUI.Copy())//Now we configure their appearance based on their unique identity, same as with a DNA machine or somesuch.
|
||||
else//If they have no records, we just do a random DNA for them, based on their random appearance/savefile.
|
||||
new_character.dna.ready_dna(new_character)
|
||||
//If you've picked a job by now, you can equip them.
|
||||
var/equipment
|
||||
if(charjob)
|
||||
equipment = alert(src,"Spawn them with equipment?", "Equipment", "Yes", "No", "Cancel")
|
||||
if(equipment == "Cancel")
|
||||
return
|
||||
else if(equipment == "Yes")
|
||||
equipment = 1
|
||||
else
|
||||
equipment = 0
|
||||
|
||||
new_character.key = G_found.key
|
||||
|
||||
/*
|
||||
The code below functions with the assumption that the mob is already a traitor if they have a special role.
|
||||
So all it does is re-equip the mob with powers and/or items. Or not, if they have no special role.
|
||||
If they don't have a mind, they obviously don't have a special role.
|
||||
*/
|
||||
|
||||
//Two variables to properly announce later on.
|
||||
//For logging later
|
||||
var/admin = key_name_admin(src)
|
||||
var/player_key = G_found.key
|
||||
var/player_key = picked_client.key
|
||||
|
||||
//Now for special roles and equipment.
|
||||
var/mob/living/carbon/human/new_character
|
||||
var/spawnloc
|
||||
|
||||
//Where did you want to spawn them?
|
||||
switch(location)
|
||||
if("Right Here") //Spawn them on your turf
|
||||
if(!src.mob)
|
||||
src << "You can't use 'Right Here' when you are not 'Right Anywhere'!"
|
||||
return
|
||||
|
||||
spawnloc = get_turf(src.mob)
|
||||
|
||||
if("Arrivals") //Spawn them at a latejoin spawnpoint
|
||||
spawnloc = pick(latejoin)
|
||||
|
||||
else //I have no idea how you're here
|
||||
src << "Invalid spawn location choice."
|
||||
return
|
||||
|
||||
//Did we actually get a loc to spawn them?
|
||||
if(!spawnloc)
|
||||
src << "Couldn't get valid spawn location."
|
||||
return
|
||||
|
||||
new_character = new(spawnloc)
|
||||
|
||||
//We were able to spawn them, right?
|
||||
if(!new_character)
|
||||
src << "Something went wrong and spawning failed."
|
||||
return
|
||||
|
||||
//Write the appearance and whatnot out to the character
|
||||
picked_client.prefs.copy_to(new_character)
|
||||
if(inhabit)
|
||||
new_character.key = player_key
|
||||
|
||||
//Were they any particular special role? If so, copy.
|
||||
var/datum/antagonist/antag_data = get_antag_data(new_character.mind.special_role)
|
||||
if(antag_data)
|
||||
antag_data.add_antagonist(new_character.mind)
|
||||
antag_data.place_mob(new_character)
|
||||
else
|
||||
job_master.EquipRank(new_character, new_character.mind.assigned_role, 1)
|
||||
|
||||
//Announces the character on all the systems, based on the record.
|
||||
if(!issilicon(new_character))//If they are not a cyborg/AI.
|
||||
if(!record_found && !player_is_antag(new_character.mind, only_offstation_roles = 1)) //If there are no records for them. If they have a record, this info is already in there. MODE people are not announced anyway.
|
||||
//Power to the user!
|
||||
if(alert(new_character,"Warning: No data core entry detected. Would you like to announce the arrival of this character by adding them to various databases, such as medical records?",,"No","Yes")=="Yes")
|
||||
//If desired, apply equipment.
|
||||
if(equipment && charjob)
|
||||
job_master.EquipRank(new_character, charjob, 1)
|
||||
|
||||
//If desired, add records.
|
||||
if(records)
|
||||
data_core.manifest_inject(new_character)
|
||||
|
||||
if(alert(new_character,"Would you like an active AI to announce this character?",,"No","Yes")=="Yes")
|
||||
call(/proc/AnnounceArrival)(new_character, new_character.mind.assigned_role)
|
||||
//A redraw for good measure
|
||||
new_character.update_icons()
|
||||
|
||||
message_admins("\blue [admin] has respawned [player_key] as [new_character.real_name].", 1)
|
||||
//If we're announcing their arrival
|
||||
if(announce)
|
||||
AnnounceArrival(new_character, new_character.mind.assigned_role)
|
||||
|
||||
new_character << "You have been fully respawned. Enjoy the game."
|
||||
log_admin("[admin] has spawned [player_key]'s character [new_character.real_name].")
|
||||
message_admins("[admin] has spawned [player_key]'s character [new_character.real_name].", 1)
|
||||
|
||||
new_character << "You have been fully spawned. Enjoy the game."
|
||||
|
||||
feedback_add_details("admin_verb","RSPCH") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
return new_character
|
||||
|
||||
/client/proc/cmd_admin_add_freeform_ai_law()
|
||||
|
||||
@@ -7,19 +7,29 @@ var/global/list/uplink_locations = list("PDA", "Headset", "None")
|
||||
/datum/category_item/player_setup_item/antagonism/basic/load_character(var/savefile/S)
|
||||
S["uplinklocation"] >> pref.uplinklocation
|
||||
S["exploit_record"] >> pref.exploit_record
|
||||
S["antag_faction"] >> pref.antag_faction
|
||||
S["antag_vis"] >> pref.antag_vis
|
||||
|
||||
/datum/category_item/player_setup_item/antagonism/basic/save_character(var/savefile/S)
|
||||
S["uplinklocation"] << pref.uplinklocation
|
||||
S["exploit_record"] << pref.exploit_record
|
||||
S["antag_faction"] << pref.antag_faction
|
||||
S["antag_vis"] << pref.antag_vis
|
||||
|
||||
/datum/category_item/player_setup_item/antagonism/basic/sanitize_character()
|
||||
pref.uplinklocation = sanitize_inlist(pref.uplinklocation, uplink_locations, initial(pref.uplinklocation))
|
||||
if(!pref.antag_faction) pref.antag_faction = "None"
|
||||
if(!pref.antag_vis) pref.antag_vis = "Hidden"
|
||||
|
||||
// Moved from /datum/preferences/proc/copy_to()
|
||||
/datum/category_item/player_setup_item/antagonism/basic/copy_to_mob(var/mob/living/carbon/human/character)
|
||||
character.exploit_record = pref.exploit_record
|
||||
character.antag_faction = pref.antag_faction
|
||||
character.antag_vis = pref.antag_vis
|
||||
|
||||
/datum/category_item/player_setup_item/antagonism/basic/content(var/mob/user)
|
||||
. += "Faction: <a href='?src=\ref[src];antagfaction=1'>[pref.antag_faction]</a><br/>"
|
||||
. += "Visibility: <a href='?src=\ref[src];antagvis=1'>[pref.antag_vis]</a><br/>"
|
||||
. +="<b>Uplink Type : <a href='?src=\ref[src];antagtask=1'>[pref.uplinklocation]</a></b>"
|
||||
. +="<br>"
|
||||
. +="<b>Exploitable information:</b><br>"
|
||||
@@ -34,9 +44,29 @@ var/global/list/uplink_locations = list("PDA", "Headset", "None")
|
||||
return TOPIC_REFRESH
|
||||
|
||||
if(href_list["exploitable_record"])
|
||||
var/exploitmsg = sanitize(input(user,"Set exploitable information about you here.","Exploitable Information", html_decode(pref.exploit_record)) as message|null, MAX_PAPER_MESSAGE_LEN, extra = 0)
|
||||
var/exploitmsg = sanitize(input(user,"Set exploitable information about you here.","Exploitable Information", html_decode(pref.exploit_record)) as message|null, MAX_RECORD_LENGTH, extra = 0)
|
||||
if(!isnull(exploitmsg) && !jobban_isbanned(user, "Records") && CanUseTopic(user))
|
||||
pref.exploit_record = exploitmsg
|
||||
return TOPIC_REFRESH
|
||||
|
||||
if(href_list["antagfaction"])
|
||||
var/choice = input(user, "Please choose an antagonistic faction to work for.", "Character Preference", pref.antag_faction) as null|anything in antag_faction_choices + list("None","Other")
|
||||
if(!choice || !CanUseTopic(user))
|
||||
return TOPIC_NOACTION
|
||||
if(choice == "Other")
|
||||
var/raw_choice = sanitize(input(user, "Please enter a faction.", "Character Preference") as text|null, MAX_NAME_LEN)
|
||||
if(raw_choice)
|
||||
pref.antag_faction = raw_choice
|
||||
else
|
||||
pref.antag_faction = choice
|
||||
return TOPIC_REFRESH
|
||||
|
||||
if(href_list["antagvis"])
|
||||
var/choice = input(user, "Please choose an antagonistic visibility level.", "Character Preference", pref.antag_vis) as null|anything in antag_visiblity_choices
|
||||
if(!choice || !CanUseTopic(user))
|
||||
return TOPIC_NOACTION
|
||||
else
|
||||
pref.antag_vis = choice
|
||||
return TOPIC_REFRESH
|
||||
|
||||
return ..()
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
var/list/available_languages = S.secondary_langs.Copy()
|
||||
for(var/L in all_languages)
|
||||
var/datum/language/lang = all_languages[L]
|
||||
if(!(lang.flags & RESTRICTED) && (!config.usealienwhitelist || is_alien_whitelisted(user, L) || !(lang.flags & WHITELISTED)))
|
||||
if(!(lang.flags & RESTRICTED) && (is_lang_whitelisted(user, lang)))
|
||||
available_languages |= L
|
||||
|
||||
// make sure we don't let them waste slots on the default languages
|
||||
|
||||
@@ -121,6 +121,8 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
I.mechassist()
|
||||
else if(status == "mechanical")
|
||||
I.robotize()
|
||||
else if(status == "digital")
|
||||
I.digitize()
|
||||
return
|
||||
|
||||
/datum/category_item/player_setup_item/general/body/content(var/mob/user)
|
||||
@@ -197,6 +199,11 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
if(ind > 1)
|
||||
. += ", "
|
||||
. += "\tSynthetic [organ_name]"
|
||||
else if(status == "digital")
|
||||
++ind
|
||||
if(ind > 1)
|
||||
. += ", "
|
||||
. += "\tDigital [organ_name]"
|
||||
else if(status == "assisted")
|
||||
++ind
|
||||
if(ind > 1)
|
||||
@@ -549,6 +556,8 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
var/list/organ_choices = list("Normal","Assisted","Mechanical")
|
||||
if(pref.organ_data[BP_TORSO] == "cyborg")
|
||||
organ_choices -= "Normal"
|
||||
if(organ_name == "Brain")
|
||||
organ_choices += "Digital"
|
||||
|
||||
var/new_state = input(user, "What state do you wish the organ to be in?") as null|anything in organ_choices
|
||||
if(!new_state) return
|
||||
@@ -560,6 +569,8 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
pref.organ_data[organ] = "assisted"
|
||||
if("Mechanical")
|
||||
pref.organ_data[organ] = "mechanical"
|
||||
if("Digital")
|
||||
pref.organ_data[organ] = "digital"
|
||||
return TOPIC_REFRESH
|
||||
|
||||
else if(href_list["disabilities"])
|
||||
@@ -629,10 +640,10 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
dat += "</table><center><hr/>"
|
||||
|
||||
var/restricted = 0
|
||||
if(config.usealienwhitelist) //If we're using the whitelist, make sure to check it!
|
||||
|
||||
if(!(current_species.spawn_flags & SPECIES_CAN_JOIN))
|
||||
restricted = 2
|
||||
else if((current_species.spawn_flags & SPECIES_IS_WHITELISTED) && !is_alien_whitelisted(preference_mob(),current_species))
|
||||
else if(!is_alien_whitelisted(preference_mob(),current_species))
|
||||
restricted = 1
|
||||
|
||||
if(restricted)
|
||||
|
||||
@@ -115,19 +115,19 @@
|
||||
return TOPIC_REFRESH
|
||||
|
||||
else if(href_list["set_medical_records"])
|
||||
var/new_medical = sanitize(input(user,"Enter medical information here.","Character Preference", html_decode(pref.med_record)) as message|null, MAX_PAPER_MESSAGE_LEN, extra = 0)
|
||||
var/new_medical = sanitize(input(user,"Enter medical information here.","Character Preference", html_decode(pref.med_record)) as message|null, MAX_RECORD_LENGTH, extra = 0)
|
||||
if(!isnull(new_medical) && !jobban_isbanned(user, "Records") && CanUseTopic(user))
|
||||
pref.med_record = new_medical
|
||||
return TOPIC_REFRESH
|
||||
|
||||
else if(href_list["set_general_records"])
|
||||
var/new_general = sanitize(input(user,"Enter employment information here.","Character Preference", html_decode(pref.gen_record)) as message|null, MAX_PAPER_MESSAGE_LEN, extra = 0)
|
||||
var/new_general = sanitize(input(user,"Enter employment information here.","Character Preference", html_decode(pref.gen_record)) as message|null, MAX_RECORD_LENGTH, extra = 0)
|
||||
if(!isnull(new_general) && !jobban_isbanned(user, "Records") && CanUseTopic(user))
|
||||
pref.gen_record = new_general
|
||||
return TOPIC_REFRESH
|
||||
|
||||
else if(href_list["set_security_records"])
|
||||
var/sec_medical = sanitize(input(user,"Enter security information here.","Character Preference", html_decode(pref.sec_record)) as message|null, MAX_PAPER_MESSAGE_LEN, extra = 0)
|
||||
var/sec_medical = sanitize(input(user,"Enter security information here.","Character Preference", html_decode(pref.sec_record)) as message|null, MAX_RECORD_LENGTH, extra = 0)
|
||||
if(!isnull(sec_medical) && !jobban_isbanned(user, "Records") && CanUseTopic(user))
|
||||
pref.sec_record = sec_medical
|
||||
return TOPIC_REFRESH
|
||||
|
||||
@@ -55,7 +55,7 @@ var/list/gear_datums = list()
|
||||
var/list/valid_gear_choices = list()
|
||||
for(var/gear_name in gear_datums)
|
||||
var/datum/gear/G = gear_datums[gear_name]
|
||||
if(G.whitelisted && !is_alien_whitelisted(preference_mob(), G.whitelisted))
|
||||
if(G.whitelisted && !is_alien_whitelisted(preference_mob(), all_species[G.whitelisted]))
|
||||
continue
|
||||
if(max_cost && G.cost > max_cost)
|
||||
continue
|
||||
|
||||
@@ -3,8 +3,12 @@
|
||||
path = /obj/item/weapon/cane
|
||||
|
||||
/datum/gear/dice
|
||||
display_name = "d20"
|
||||
path = /obj/item/weapon/dice/d20
|
||||
display_name = "dice pack"
|
||||
path = /obj/item/weapon/storage/pill_bottle/dice
|
||||
|
||||
/datum/gear/dice/nerd
|
||||
display_name = "dice pack (gaming)"
|
||||
path = /obj/item/weapon/storage/pill_bottle/dice_nerd
|
||||
|
||||
/datum/gear/cards
|
||||
display_name = "deck of cards"
|
||||
|
||||
@@ -49,3 +49,11 @@
|
||||
/datum/gear/gloves/white
|
||||
display_name = "gloves, white"
|
||||
path = /obj/item/clothing/gloves/white
|
||||
|
||||
/datum/gear/gloves/evening
|
||||
display_name = "evening gloves"
|
||||
path = /obj/item/clothing/gloves/evening
|
||||
|
||||
/datum/gear/gloves/evening/New()
|
||||
..()
|
||||
gear_tweaks = list(gear_tweak_free_color_choice)
|
||||
|
||||
@@ -208,7 +208,7 @@
|
||||
/datum/gear/suit/wintercoat/security
|
||||
display_name = "winter coat, security"
|
||||
path = /obj/item/clothing/suit/storage/hooded/wintercoat/security
|
||||
allowed_roles = list("Security Officer, Head of Security, Warden, Detective")
|
||||
allowed_roles = list("Security Officer", "Head of Security", "Warden", "Detective")
|
||||
|
||||
/datum/gear/suit/wintercoat/medical
|
||||
display_name = "winter coat, medical"
|
||||
@@ -268,3 +268,15 @@
|
||||
var/obj/item/clothing/suit/storage/toggle/track/track = track_style
|
||||
tracks[initial(track.name)] = track
|
||||
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(tracks))
|
||||
|
||||
/datum/gear/suit/flannel
|
||||
display_name = "grey flannel"
|
||||
path = /obj/item/clothing/suit/storage/flannel
|
||||
|
||||
/datum/gear/suit/flannel/red
|
||||
display_name = "red flannel"
|
||||
path = /obj/item/clothing/suit/storage/flannel/red
|
||||
|
||||
/datum/gear/suit/flannel/aqua
|
||||
display_name = "aqua flannel"
|
||||
path = /obj/item/clothing/suit/storage/flannel/aqua
|
||||
@@ -54,8 +54,10 @@ datum/preferences
|
||||
//Some faction information.
|
||||
var/home_system = "Unset" //System of birth.
|
||||
var/citizenship = "None" //Current home system.
|
||||
var/faction = "None" //Antag faction/general associated faction.
|
||||
var/faction = "None" //General associated faction.
|
||||
var/religion = "None" //Religious association.
|
||||
var/antag_faction = "None" //Antag associated faction.
|
||||
var/antag_vis = "Hidden" //How visible antag association is to others.
|
||||
|
||||
//Mob preview
|
||||
var/icon/preview_icon = null
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
var/global/list/seen_citizenships = list()
|
||||
var/global/list/seen_systems = list()
|
||||
var/global/list/seen_factions = list()
|
||||
var/global/list/seen_antag_factions = list()
|
||||
var/global/list/seen_religions = list()
|
||||
|
||||
//Commenting this out for now until I work the lists it into the event generator/journalist/chaplain.
|
||||
@@ -25,6 +26,7 @@ var/global/list/home_system_choices = list(
|
||||
starsys_name,
|
||||
"Nyx",
|
||||
"Tau Ceti",
|
||||
"Qerr'Vallis",
|
||||
"Epsilon Ursae Minoris",
|
||||
"S'randarr"
|
||||
)
|
||||
@@ -43,6 +45,14 @@ var/global/list/faction_choices = list(
|
||||
"Hesphaistos Industries"
|
||||
)
|
||||
|
||||
var/global/list/antag_faction_choices = list() //Should be populated after brainstorming. Leaving as blank in case brainstorming does not occur.
|
||||
|
||||
var/global/list/antag_visiblity_choices = list(
|
||||
"Hidden",
|
||||
"Shared",
|
||||
"Known"
|
||||
)
|
||||
|
||||
var/global/list/religion_choices = list(
|
||||
"Unitarianism",
|
||||
"Hinduism",
|
||||
|
||||
@@ -212,7 +212,7 @@
|
||||
siemens_coefficient = 0.75
|
||||
var/wired = 0
|
||||
var/obj/item/weapon/cell/cell = 0
|
||||
var/clipped = 0
|
||||
var/overgloves = 0
|
||||
body_parts_covered = HANDS
|
||||
slot_flags = SLOT_GLOVES
|
||||
attack_verb = list("challenged")
|
||||
|
||||
@@ -46,8 +46,6 @@ BLIND // can't see anything
|
||||
active = 1
|
||||
icon_state = initial(icon_state)
|
||||
user.update_inv_glasses()
|
||||
if(activation_sound)
|
||||
usr << activation_sound
|
||||
usr << "You activate the optical matrix on the [src]."
|
||||
user.update_action_buttons()
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
desc = "These arm guards will protect your hands and arms."
|
||||
body_parts_covered = HANDS|ARMS
|
||||
slowdown = 1
|
||||
overgloves = 1
|
||||
w_class = 3
|
||||
|
||||
/obj/item/clothing/gloves/arm_guard/mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0)
|
||||
|
||||
@@ -84,3 +84,14 @@
|
||||
desc = "A pair of gloves, they don't look special in any way."
|
||||
icon_state = "brown"
|
||||
item_state = "browngloves"
|
||||
|
||||
/obj/item/clothing/gloves/evening
|
||||
desc = "A pair of gloves that reach past the elbow. Fancy!"
|
||||
name = "evening gloves"
|
||||
icon_state = "evening_gloves"
|
||||
item_state = "graygloves"
|
||||
|
||||
cold_protection = HANDS
|
||||
min_cold_protection_temperature = GLOVES_MIN_COLD_PROTECTION_TEMPERATURE
|
||||
heat_protection = HANDS
|
||||
max_heat_protection_temperature = GLOVES_MAX_HEAT_PROTECTION_TEMPERATURE
|
||||
|
||||
44
code/modules/clothing/gloves/gauntlets.dm
Normal file
44
code/modules/clothing/gloves/gauntlets.dm
Normal file
@@ -0,0 +1,44 @@
|
||||
/*
|
||||
* WORKS FOR RIGS, NOT AS A STANDALONE RIGHT NOW
|
||||
*
|
||||
* TODO: FIX QUICK_EQUIP SO IT DOESN'T EQUIP THESE TO YOUR BACK WHEN YOU HAVE NO GLOVES
|
||||
* CHECK SLOWDOWN ON EQUIP/UNEQUIP
|
||||
* ADD SPRITES FOR ANY ACTUAL GAUNTLET ITEMS, THE BASE GLOVE ITEM HAS NO SPRITE, FOR GOOD REASON
|
||||
*/
|
||||
|
||||
/obj/item/clothing/gloves/gauntlets //Used to cover gloves, otherwise act as gloves.
|
||||
name = "gauntlets"
|
||||
desc = "These gloves go over regular gloves."
|
||||
overgloves = 1
|
||||
var/obj/item/clothing/gloves/gloves = null //Undergloves
|
||||
var/mob/living/carbon/human/wearer = null //For glove procs
|
||||
|
||||
/obj/item/clothing/gloves/gauntlets/mob_can_equip(mob/user)
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(H.gloves)
|
||||
gloves = H.gloves
|
||||
if(gloves.overgloves)
|
||||
user << "You are unable to wear \the [src] as \the [H.gloves] are in the way."
|
||||
gloves = null
|
||||
return 0
|
||||
H.drop_from_inventory(gloves)
|
||||
gloves.forceMove(src)
|
||||
|
||||
if(!..())
|
||||
if(gloves)
|
||||
if(H.equip_to_slot_if_possible(gloves, slot_gloves))
|
||||
gloves = null
|
||||
return 0
|
||||
if(gloves)
|
||||
user << "You slip \the [src] on over \the [gloves]."
|
||||
wearer = H
|
||||
return 1
|
||||
|
||||
/obj/item/clothing/gloves/gauntlets/dropped()
|
||||
var/mob/living/carbon/human/H = wearer
|
||||
if(gloves)
|
||||
if(!H.equip_to_slot_if_possible(gloves, slot_gloves))
|
||||
gloves.forceMove(get_turf(src))
|
||||
src.gloves = null
|
||||
wearer = null
|
||||
..()
|
||||
@@ -38,6 +38,31 @@
|
||||
gas_transfer_coefficient = 0.90
|
||||
permeability_coefficient = 0.01
|
||||
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 60, rad = 0)
|
||||
var/hanging = 0
|
||||
|
||||
/obj/item/clothing/mask/surgical/proc/adjust_mask(mob_user)
|
||||
if(usr.canmove && !usr.stat)
|
||||
src.hanging = !src.hanging
|
||||
if (src.hanging)
|
||||
gas_transfer_coefficient = 1
|
||||
body_parts_covered = body_parts_covered & ~FACE
|
||||
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
icon_state = "steriledown"
|
||||
usr << "You pull the mask below your chin."
|
||||
else
|
||||
gas_transfer_coefficient = initial(gas_transfer_coefficient)
|
||||
body_parts_covered = initial(body_parts_covered)
|
||||
icon_state = initial(icon_state)
|
||||
armor = initial(armor)
|
||||
usr << "You pull the mask up to cover your face."
|
||||
update_clothing_icon()
|
||||
|
||||
/obj/item/clothing/mask/surgical/verb/toggle()
|
||||
set category = "Object"
|
||||
set name = "Adjust mask"
|
||||
set src in usr
|
||||
|
||||
adjust_mask(usr)
|
||||
|
||||
/obj/item/clothing/mask/fakemoustache
|
||||
name = "fake moustache"
|
||||
@@ -160,7 +185,32 @@
|
||||
flags_inv = HIDEFACE
|
||||
slot_flags = SLOT_MASK
|
||||
icon_state = "bandblack"
|
||||
item_state = null
|
||||
item_state = "bandblack"
|
||||
var/tied = 0
|
||||
|
||||
/obj/item/clothing/mask/bandana/proc/adjust_bandana(mob/user)
|
||||
if(usr.canmove && !usr.stat)
|
||||
src.tied = !src.tied
|
||||
if (src.tied)
|
||||
flags_inv = flags_inv & ~HIDEFACE
|
||||
slot_flags = SLOT_HEAD
|
||||
icon_state = "[icon_state]_up"
|
||||
item_state = "[item_state]_up"
|
||||
usr << "You tie the bandana so that it can be worn on the head."
|
||||
else
|
||||
flags_inv = initial(flags_inv)
|
||||
slot_flags = initial(slot_flags)
|
||||
icon_state = initial(icon_state)
|
||||
item_state = initial(item_state)
|
||||
usr << "You tie the bandana so that it can be worn on the face."
|
||||
|
||||
/obj/item/clothing/mask/bandana/verb/toggle()
|
||||
set category = "Object"
|
||||
set name = "Tie bandana"
|
||||
set src in usr
|
||||
|
||||
adjust_bandana(usr)
|
||||
update_icon()
|
||||
|
||||
/obj/item/clothing/mask/bandana/red
|
||||
name = "red bandana"
|
||||
|
||||
@@ -434,6 +434,8 @@
|
||||
holder.spark_system.start()
|
||||
playsound(H.loc, 'sound/effects/sparks2.ogg', 50, 1)
|
||||
|
||||
H.break_cloak()
|
||||
|
||||
if(!holder.cell)
|
||||
H << "<span class = 'danger'>Your power sink flashes an error; there is no cell in your rig.</span>"
|
||||
drain_complete(H)
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
|
||||
anim(get_turf(H), H, 'icons/effects/effects.dmi', "electricity",null,20,null)
|
||||
|
||||
H.visible_message("[H.name] vanishes into thin air!",1)
|
||||
H.visible_message("[H.name] vanishes into thin air!")
|
||||
|
||||
/obj/item/rig_module/stealth_field/deactivate()
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
var/chest_type = /obj/item/clothing/suit/space/rig
|
||||
var/helm_type = /obj/item/clothing/head/helmet/space/rig
|
||||
var/boot_type = /obj/item/clothing/shoes/magboots/rig
|
||||
var/glove_type = /obj/item/clothing/gloves/rig
|
||||
var/glove_type = /obj/item/clothing/gloves/gauntlets/rig
|
||||
var/cell_type = /obj/item/weapon/cell/high
|
||||
var/air_type = /obj/item/weapon/tank/oxygen
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
)
|
||||
species_restricted = null
|
||||
|
||||
/obj/item/clothing/gloves/rig
|
||||
/obj/item/clothing/gloves/gauntlets/rig
|
||||
name = "gauntlets"
|
||||
item_flags = THICKMATERIAL
|
||||
body_parts_covered = HANDS
|
||||
@@ -128,7 +128,7 @@
|
||||
species_restricted = null
|
||||
gender = PLURAL
|
||||
|
||||
/obj/item/clothing/gloves/lightrig
|
||||
/obj/item/clothing/gloves/gauntlets/lightrig
|
||||
name = "gloves"
|
||||
flags = THICKMATERIAL
|
||||
body_parts_covered = HANDS
|
||||
|
||||
@@ -15,13 +15,13 @@
|
||||
chest_type = /obj/item/clothing/suit/space/rig/light
|
||||
helm_type = /obj/item/clothing/head/helmet/space/rig/light
|
||||
boot_type = /obj/item/clothing/shoes/magboots/rig/light
|
||||
glove_type = /obj/item/clothing/gloves/rig/light
|
||||
glove_type = /obj/item/clothing/gloves/gauntlets/rig/light
|
||||
|
||||
/obj/item/clothing/suit/space/rig/light
|
||||
name = "suit"
|
||||
breach_threshold = 18 //comparable to voidsuits
|
||||
|
||||
/obj/item/clothing/gloves/rig/light
|
||||
/obj/item/clothing/gloves/gauntlets/rig/light
|
||||
name = "gloves"
|
||||
|
||||
/obj/item/clothing/shoes/magboots/rig/light
|
||||
@@ -43,7 +43,7 @@
|
||||
|
||||
helm_type = /obj/item/clothing/head/lightrig/hacker
|
||||
chest_type = /obj/item/clothing/suit/lightrig/hacker
|
||||
glove_type = /obj/item/clothing/gloves/lightrig/hacker
|
||||
glove_type = /obj/item/clothing/gloves/gauntlets/lightrig/hacker
|
||||
boot_type = /obj/item/clothing/shoes/lightrig/hacker
|
||||
|
||||
initial_modules = list(
|
||||
@@ -68,20 +68,20 @@
|
||||
siemens_coefficient = 0.4
|
||||
flags = NOSLIP //All the other rigs have magboots anyways, hopefully gives the hacker suit something more going for it.
|
||||
|
||||
/obj/item/clothing/gloves/lightrig/hacker
|
||||
/obj/item/clothing/gloves/gauntlets/lightrig/hacker
|
||||
siemens_coefficient = 0
|
||||
|
||||
/obj/item/weapon/rig/light/ninja
|
||||
name = "ominous suit control module"
|
||||
suit_type = "ominous"
|
||||
desc = "A unique, vaccum-proof suit of nano-enhanced armor designed specifically for Spider Clan assassins."
|
||||
desc = "A unique suit of nano-enhanced armor designed for covert operations."
|
||||
icon_state = "ninja_rig"
|
||||
armor = list(melee = 50, bullet = 15, laser = 30, energy = 10, bomb = 25, bio = 100, rad = 30)
|
||||
emp_protection = 40 //change this to 30 if too high.
|
||||
slowdown = 0
|
||||
|
||||
chest_type = /obj/item/clothing/suit/space/rig/light/ninja
|
||||
glove_type = /obj/item/clothing/gloves/rig/light/ninja
|
||||
glove_type = /obj/item/clothing/gloves/gauntlets/rig/light/ninja
|
||||
cell_type = /obj/item/weapon/cell/hyper
|
||||
|
||||
req_access = list(access_syndicate)
|
||||
@@ -103,7 +103,7 @@
|
||||
|
||||
..()
|
||||
|
||||
/obj/item/clothing/gloves/rig/light/ninja
|
||||
/obj/item/clothing/gloves/gauntlets/rig/light/ninja
|
||||
name = "insulated gloves"
|
||||
siemens_coefficient = 0
|
||||
|
||||
|
||||
@@ -386,6 +386,7 @@
|
||||
desc = "A heavily armored suit that protects against moderate damage."
|
||||
icon_state = "heavy"
|
||||
item_state = "swat_suit"
|
||||
armor = list(melee = 60, bullet = 60, laser = 60, energy = 40, bomb = 40, bio = 0, rad = 0)
|
||||
w_class = 4//bulky item
|
||||
gas_transfer_coefficient = 0.90
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
|
||||
@@ -396,6 +397,7 @@
|
||||
/obj/item/clothing/suit/armor/tdome
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
|
||||
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
|
||||
armor = list(melee = 60, bullet = 60, laser = 60, energy = 40, bomb = 40, bio = 0, rad = 0)
|
||||
|
||||
/obj/item/clothing/suit/armor/tdome/red
|
||||
name = "Thunderdome suit (red)"
|
||||
|
||||
@@ -720,3 +720,80 @@
|
||||
item_state = "trackjacketwhite"
|
||||
icon_open = "trackjacketwhite_open"
|
||||
icon_closed = "trackjacketwhite"
|
||||
|
||||
//Flannels
|
||||
|
||||
/obj/item/clothing/suit/storage/flannel
|
||||
name = "Flannel shirt"
|
||||
desc = "A comfy, grey flannel shirt. Unleash your inner hipster."
|
||||
icon_state = "flannel"
|
||||
item_state = "gy_suit"
|
||||
var/rolled = 0
|
||||
var/tucked = 0
|
||||
var/buttoned = 0
|
||||
|
||||
/obj/item/clothing/suit/storage/flannel/verb/roll_sleeves()
|
||||
set name = "Roll Sleeves"
|
||||
set category = "Object"
|
||||
set src in usr
|
||||
if(!istype(usr, /mob/living))
|
||||
return
|
||||
if(usr.stat)
|
||||
return
|
||||
|
||||
if(rolled == 0)
|
||||
rolled = 1
|
||||
usr << "<span class='notice'>You roll up the sleeves of your [src].</span>"
|
||||
else
|
||||
rolled = 0
|
||||
usr << "<span class='notice'>You roll down the sleeves of your [src].</span>"
|
||||
update_icon()
|
||||
|
||||
/obj/item/clothing/suit/storage/flannel/verb/tuck()
|
||||
set name = "Toggle Shirt Tucking"
|
||||
set category = "Object"
|
||||
set src in usr
|
||||
if(!istype(usr, /mob/living)||usr.stat)
|
||||
return
|
||||
|
||||
if(tucked == 0)
|
||||
tucked = 1
|
||||
usr << "<span class='notice'>You tuck in your your [src].</span>"
|
||||
else
|
||||
tucked = 0
|
||||
usr << "<span class='notice'>You untuck your [src].</span>"
|
||||
update_icon()
|
||||
|
||||
/obj/item/clothing/suit/storage/flannel/verb/button()
|
||||
set name = "Toggle Shirt Buttons"
|
||||
set category = "Object"
|
||||
set src in usr
|
||||
if(!istype(usr, /mob/living)||usr.stat)
|
||||
return
|
||||
|
||||
if(buttoned == 0)
|
||||
buttoned = 1
|
||||
usr << "<span class='notice'>You unbutton your [src].</span>"
|
||||
else
|
||||
buttoned = 0
|
||||
usr<<"<span class='notice'>You button your [src].</span>"
|
||||
update_icon()
|
||||
|
||||
/obj/item/clothing/suit/storage/flannel/update_icon()
|
||||
icon_state = initial(icon_state)
|
||||
if(rolled)
|
||||
icon_state += "r"
|
||||
if(tucked)
|
||||
icon_state += "t"
|
||||
if(buttoned)
|
||||
icon_state += "b"
|
||||
|
||||
/obj/item/clothing/suit/storage/flannel/red
|
||||
desc = "A comfy, red flannel shirt. Unleash your inner hipster."
|
||||
icon_state = "flannel_red"
|
||||
item_state = "r_suit"
|
||||
|
||||
/obj/item/clothing/suit/storage/flannel/aqua
|
||||
desc = "A comfy, aqua flannel shirt. Unleash your inner hipster."
|
||||
icon_state = "flannel_aqua"
|
||||
item_state = "b_suit"
|
||||
@@ -12,6 +12,8 @@
|
||||
var/image/mob_overlay = null
|
||||
var/overlay_state = null
|
||||
|
||||
sprite_sheets = list("Teshari" = 'icons/mob/species/seromi/ties.dmi') //Teshari can into webbing, too!
|
||||
|
||||
/obj/item/clothing/accessory/Destroy()
|
||||
on_removed()
|
||||
return ..()
|
||||
|
||||
@@ -42,6 +42,18 @@
|
||||
/datum/reagent/drink/milkshake
|
||||
price_tag = 2
|
||||
|
||||
/datum/reagent/drink/roy_rogers
|
||||
price_tag = 2
|
||||
|
||||
/datum/reagent/drink/shirley_temple
|
||||
price_tag = 2
|
||||
|
||||
/datum/reagent/drink/arnold_palmer
|
||||
price_tag = 2
|
||||
|
||||
/datum/reagent/drink/collins_mix
|
||||
price_tag = 2
|
||||
|
||||
|
||||
// Beer //
|
||||
|
||||
@@ -322,6 +334,7 @@
|
||||
price_tag = 3
|
||||
|
||||
|
||||
|
||||
// From the machine //
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/cans/cola
|
||||
|
||||
9
code/modules/examine/descriptions/machines.dm
Normal file
9
code/modules/examine/descriptions/machines.dm
Normal file
@@ -0,0 +1,9 @@
|
||||
/obj/machinery/porta_turret
|
||||
description_info = "This is a turret utilizing an internal energy weapon. Generally, these can fire stun beams, or lasers, and can \
|
||||
be configured by unlocking and interfacing with them nearby, or controlled remotely with a turret control switch."
|
||||
description_antag = "Turrets can be emagged to target anyone and everyone, on lethals, and cannot be turned off if emagged."
|
||||
|
||||
/obj/machinery/porta_turret/ai_defense
|
||||
description_info = "This is a varient of the normal turret, utilizing an internal energy weapon. This version can fire stun \
|
||||
beams, or an xray laser, which is much harder for solid objects to stop than normal laser light, and can be configured remotely \
|
||||
with a turret control switch. This varient is also much more durable, and is hardened against electromagnetic pulses."
|
||||
@@ -144,6 +144,13 @@ I said no!
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/mimeburger
|
||||
|
||||
/datum/recipe/bunbun
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/bun,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/bun
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/bunbun
|
||||
|
||||
/datum/recipe/hotdog
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/bun,
|
||||
|
||||
@@ -134,7 +134,7 @@
|
||||
if(P.name != "Blank Card")
|
||||
user << "You cannot write on that card."
|
||||
return
|
||||
var/cardtext = sanitize(input(user, "What do you wish to write on the card?", "Card Editing") as text|null, MAX_BOOK_MESSAGE_LEN)
|
||||
var/cardtext = sanitize(input(user, "What do you wish to write on the card?", "Card Editing") as text|null, MAX_PAPER_MESSAGE_LEN)
|
||||
if(!cardtext)
|
||||
return
|
||||
P.name = cardtext
|
||||
|
||||
@@ -73,7 +73,7 @@
|
||||
set_trait(TRAIT_PRODUCTION,5)
|
||||
set_trait(TRAIT_YIELD,2)
|
||||
set_trait(TRAIT_POTENCY,10)
|
||||
set_trait(TRAIT_PRODUCT_COLOUR,"c9fa16")
|
||||
set_trait(TRAIT_PRODUCT_COLOUR,"#c9fa16")
|
||||
set_trait(TRAIT_WATER_CONSUMPTION, 3)
|
||||
set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.25)
|
||||
|
||||
|
||||
@@ -42,6 +42,7 @@
|
||||
new/datum/stack_recipe("green comfy chair", /obj/structure/bed/chair/comfy/green, 2, one_per_turf = 1, on_floor = 1), \
|
||||
))
|
||||
recipes += new/datum/stack_recipe("table frame", /obj/structure/table, 1, time = 10, one_per_turf = 1, on_floor = 1)
|
||||
recipes += new/datum/stack_recipe("bench frame", /obj/structure/table/bench, 1, time = 10, one_per_turf = 1, on_floor = 1)
|
||||
recipes += new/datum/stack_recipe("rack", /obj/structure/table/rack, 1, time = 5, one_per_turf = 1, on_floor = 1)
|
||||
recipes += new/datum/stack_recipe("closet", /obj/structure/closet, 2, time = 15, one_per_turf = 1, on_floor = 1)
|
||||
recipes += new/datum/stack_recipe("canister", /obj/machinery/portable_atmospherics/canister, 10, time = 15, one_per_turf = 1, on_floor = 1)
|
||||
@@ -78,6 +79,7 @@
|
||||
recipes += new/datum/stack_recipe("grenade casing", /obj/item/weapon/grenade/chem_grenade)
|
||||
recipes += new/datum/stack_recipe("light fixture frame", /obj/item/frame/light, 2)
|
||||
recipes += new/datum/stack_recipe("small light fixture frame", /obj/item/frame/light/small, 1)
|
||||
recipes += new/datum/stack_recipe("floor lamp fixture frame", /obj/machinery/light_construct/flamp, 2)
|
||||
recipes += new/datum/stack_recipe("apc frame", /obj/item/frame/apc, 2)
|
||||
recipes += new/datum/stack_recipe_list("filing cabinets", list( \
|
||||
new/datum/stack_recipe("filing cabinet", /obj/structure/filingcabinet, 4, time = 20, one_per_turf = 1, on_floor = 1), \
|
||||
@@ -110,7 +112,8 @@
|
||||
recipes += new/datum/stack_recipe("shower curtain", /obj/structure/curtain, 4, time = 15, one_per_turf = 1, on_floor = 1)
|
||||
recipes += new/datum/stack_recipe("plastic flaps", /obj/structure/plasticflaps, 4, time = 25, one_per_turf = 1, on_floor = 1)
|
||||
recipes += new/datum/stack_recipe("airtight plastic flaps", /obj/structure/plasticflaps/mining, 5, time = 25, one_per_turf = 1, on_floor = 1)
|
||||
recipes += new/datum/stack_recipe("water-cooler", /obj/structure/reagent_dispensers/water_cooler, 4, time = 1, one_per_turf = 1, on_floor = 1)
|
||||
recipes += new/datum/stack_recipe("water-cooler", /obj/structure/reagent_dispensers/water_cooler, 4, time = 10, one_per_turf = 1, on_floor = 1)
|
||||
recipes += new/datum/stack_recipe("lampshade", /obj/item/weapon/lampshade, 1, time = 1)
|
||||
|
||||
/material/wood/generate_recipes()
|
||||
..()
|
||||
|
||||
@@ -164,6 +164,12 @@
|
||||
item_state = "sheet-metal"
|
||||
default_type = "plasteel"
|
||||
|
||||
/obj/item/stack/material/durasteel
|
||||
name = "durasteel"
|
||||
icon_state = "sheet-durasteel"
|
||||
item_state = "sheet-metal"
|
||||
default_type = "durasteel"
|
||||
|
||||
/obj/item/stack/material/wood
|
||||
name = "wooden plank"
|
||||
icon_state = "sheet-wood"
|
||||
|
||||
@@ -91,6 +91,7 @@ var/list/name_to_material
|
||||
var/melting_point = 1800 // K, walls will take damage if they're next to a fire hotter than this
|
||||
var/integrity = 150 // General-use HP value for products.
|
||||
var/opacity = 1 // Is the material transparent? 0.5< makes transparent walls/doors.
|
||||
var/reflectivity = 0 // How reflective to light is the material? Currently used for laser defense.
|
||||
var/explosion_resistance = 5 // Only used by walls currently.
|
||||
var/conductive = 1 // Objects with this var add CONDUCTS to flags on spawn.
|
||||
var/list/composite_material // If set, object matter var will be a list containing these values.
|
||||
@@ -234,6 +235,7 @@ var/list/name_to_material
|
||||
cut_delay = 60
|
||||
icon_colour = "#00FFE1"
|
||||
opacity = 0.4
|
||||
reflectivity = 0.6
|
||||
shard_type = SHARD_SHARD
|
||||
tableslam_noise = 'sound/effects/Glasshit.ogg'
|
||||
hardness = 100
|
||||
@@ -356,6 +358,22 @@ var/list/name_to_material
|
||||
stack_origin_tech = list(TECH_MATERIAL = 2)
|
||||
composite_material = list(DEFAULT_WALL_MATERIAL = SHEET_MATERIAL_AMOUNT, "platinum" = SHEET_MATERIAL_AMOUNT) //todo
|
||||
|
||||
// Very rare alloy that is reflective, should be used sparingly.
|
||||
/material/durasteel
|
||||
name = "durasteel"
|
||||
stack_type = /obj/item/stack/material/durasteel
|
||||
integrity = 600
|
||||
melting_point = 7000
|
||||
icon_base = "metal"
|
||||
icon_reinf = "reinf_metal"
|
||||
icon_colour = "#6EA7BE"
|
||||
explosion_resistance = 75
|
||||
hardness = 100
|
||||
weight = 28
|
||||
reflectivity = 0.7 // Not a perfect mirror, but close.
|
||||
stack_origin_tech = list(TECH_MATERIAL = 8)
|
||||
composite_material = list("plasteel" = SHEET_MATERIAL_AMOUNT, "diamond" = SHEET_MATERIAL_AMOUNT) //shrug
|
||||
|
||||
/material/plasteel/titanium
|
||||
name = "titanium"
|
||||
stack_type = null
|
||||
|
||||
@@ -8,6 +8,17 @@
|
||||
var/product
|
||||
var/metaltag
|
||||
|
||||
/datum/alloy/durasteel
|
||||
metaltag = "durasteel"
|
||||
requires = list(
|
||||
"diamond" = 1,
|
||||
"platinum" = 1,
|
||||
"carbon" = 2,
|
||||
"hematite" = 2
|
||||
)
|
||||
product_mod = 0.3
|
||||
product = /obj/item/stack/material/durasteel
|
||||
|
||||
/datum/alloy/plasteel
|
||||
metaltag = "plasteel"
|
||||
requires = list(
|
||||
|
||||
@@ -61,6 +61,7 @@ var/global/list/ore_data = list()
|
||||
name = "sand"
|
||||
display_name = "sand"
|
||||
smelts_to = "glass"
|
||||
alloy = 1
|
||||
compresses_to = "sandstone"
|
||||
|
||||
/ore/phoron
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/mob/living/carbon/alien/diona/confirm_evolution()
|
||||
|
||||
if(!is_alien_whitelisted(src, "Diona") && config.usealienwhitelist)
|
||||
if(!is_alien_whitelisted(src, all_species["Diona"]))
|
||||
src << alert("You are currently not whitelisted to play as a full diona.")
|
||||
return null
|
||||
|
||||
|
||||
@@ -21,6 +21,9 @@
|
||||
/obj/item/organ/internal/brain/mechassist()
|
||||
replace_self_with(/obj/item/organ/internal/mmi_holder)
|
||||
|
||||
/obj/item/organ/internal/brain/digitize()
|
||||
replace_self_with(/obj/item/organ/internal/mmi_holder/robot)
|
||||
|
||||
/obj/item/organ/internal/brain/proc/replace_self_with(replace_path)
|
||||
var/mob/living/carbon/human/tmp_owner = owner
|
||||
qdel(src)
|
||||
|
||||
@@ -613,7 +613,7 @@ wink, yawn, swish, sway/wag, fastsway/qwag, stopsway/swag"}
|
||||
set desc = "Sets a description which will be shown when someone examines you."
|
||||
set category = "IC"
|
||||
|
||||
pose = sanitize(input(usr, "This is [src]. [get_visible_gender() == MALE ? "He" : get_visible_gender() == FEMALE ? "She" : "They"] [get_visible_gender() == NEUTER ? "are" : "is"]...", "Pose", null) as text)
|
||||
pose = sanitize(input(usr, "This is [src]. [get_visible_gender() == MALE ? "He" : get_visible_gender() == FEMALE ? "She" : "They"]...", "Pose", null) as text)
|
||||
|
||||
/mob/living/carbon/human/verb/set_flavor()
|
||||
set name = "Set Flavour Text"
|
||||
|
||||
@@ -401,7 +401,7 @@
|
||||
if (pose)
|
||||
if( findtext(pose,".",lentext(pose)) == 0 && findtext(pose,"!",lentext(pose)) == 0 && findtext(pose,"?",lentext(pose)) == 0 )
|
||||
pose = addtext(pose,".") //Makes sure all emotes end with a period.
|
||||
msg += "\n[T.He] [T.is] [pose]"
|
||||
msg += "\n[T.He] [pose]"
|
||||
|
||||
user << msg
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user