Merge branch 'master' of https://github.com/PolarisSS13/Polaris into 12/16/2015_newwizard

This commit is contained in:
Neerti
2016-07-08 21:00:12 -04:00
162 changed files with 3024 additions and 935 deletions

View File

@@ -5,7 +5,7 @@ sudo: false
env:
BYOND_MAJOR="510"
BYOND_MINOR="1346"
MACRO_COUNT=987
MACRO_COUNT=986
cache:
directories:

View File

@@ -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"

View File

@@ -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"

View File

@@ -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)

View File

@@ -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

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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(

View File

@@ -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

View File

@@ -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"

View File

@@ -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})

View File

@@ -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

View File

@@ -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"

View File

@@ -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

View File

@@ -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"

View File

@@ -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

View File

@@ -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"

View File

@@ -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"

View File

@@ -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"

View File

@@ -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

View File

@@ -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

View 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])"

View File

@@ -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"

View File

@@ -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)

View File

@@ -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

View File

@@ -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)

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -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,

View 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

View File

@@ -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"

View 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)
. = ..()

View 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

View 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

View 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

View 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,
)

View 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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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 = ""

View File

@@ -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

View File

@@ -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

View File

@@ -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>

View File

@@ -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

View File

@@ -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
View 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.

View File

@@ -43,3 +43,6 @@
return
/turf/simulated/wall/titanium/New(var/newloc)
..(newloc,"titanium")
/turf/simulated/wall/durasteel/New(var/newloc)
..(newloc,"durasteel", "durasteel")

View File

@@ -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

View 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

View File

@@ -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

View File

@@ -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 ,

View File

@@ -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.")

View File

@@ -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()

View File

@@ -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 ..()

View File

@@ -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

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -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"

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -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",

View File

@@ -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")

View File

@@ -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()

View File

@@ -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)

View File

@@ -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

View 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
..()

View File

@@ -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"

View File

@@ -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)

View File

@@ -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()

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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)"

View File

@@ -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"

View File

@@ -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 ..()

View File

@@ -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

View 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."

View File

@@ -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,

View File

@@ -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

View File

@@ -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)

View File

@@ -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()
..()

View File

@@ -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"

View File

@@ -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

View File

@@ -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(

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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"

View File

@@ -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