Merge remote-tracking branch 'upstream/master' into kk-headsets

This commit is contained in:
Killian
2024-11-25 05:15:28 +00:00
166 changed files with 2310 additions and 1155 deletions
+6
View File
@@ -80,3 +80,9 @@
**Creator:** VerySoft (https://github.com/TS-Rogue-Star/Rogue-Star/pull/435)<br>
**URL:** [Website](https://rogue-star.net/)<br>
**License:** Permission granting in writing for use by Virgo and Chomp with proper attribution
<br>
**File:** `icons/mob/turkey.dmi`
**Title:** Turkey<br>
**Creator:** VerySoft (https://github.com/TS-Rogue-Star/Rogue-Star/pull/669)<br>
**URL:** [Website](https://rogue-star.net/)<br>
**License:** Permission granted in writing for use by Virgo and Chomp with proper attribution
+1
View File
@@ -41,6 +41,7 @@
#define CE_DARKSIGHT "darksight" // Gives perfect vision in dark
#define REAGENTS_PER_SHEET 20
#define REAGENTS_PER_ORE 20
// Attached to CE_ANTIBIOTIC
#define ANTIBIO_NORM 1
+3
View File
@@ -40,6 +40,9 @@
#define ACCESSORY_SLOT_ARMOR_M 0x8000
#define ACCESSORY_SLOT_HELM_C 0x10000 //24 bit - higher than 0x80000 will overflow
#define ACCESSORY_SLOT_RING 0x20000 //rings, knuckledusters
#define ACCESSORY_SLOT_WRIST 0x40000 //wristwatches, wrist PDA maybe?
// Bitmasks for the /obj/item/var/flags_inv variable. These determine when a piece of clothing hides another, i.e. a helmet hiding glasses.
// WARNING: The following flags apply only to the external suit!
#define HIDEGLOVES 0x1
+1
View File
@@ -201,6 +201,7 @@
#define JOB_ALT_CONSTRUCTION_ENGINEER "Construction Engineer"
#define JOB_ALT_ENGINEERING_CONTRACTOR "Engineering Contractor"
#define JOB_ALT_COMPUTER_TECHNICIAN "Computer Technician"
#define JOB_ALT_SALVAGE_TECHNICIAN "Salvage Technician"
#define JOB_ATMOSPHERIC_TECHNICIAN "Atmospheric Technician"
// Atmospheric Technician alt titles
+2 -2
View File
@@ -172,7 +172,7 @@
if(ismob(I))
if(!sight_check || isInSight(I, O))
L |= recursive_content_check(I, L, recursion_limit - 1, client_check, sight_check, include_mobs, include_objects)
L |= recursive_content_check(I, L, recursion_limit - 1, client_check, sight_check, include_mobs, include_objects, ignore_show_messages)
if(include_mobs)
if(client_check)
var/mob/M = I
@@ -185,7 +185,7 @@
var/obj/check_obj = I
if(ignore_show_messages || check_obj.show_messages)
if(!sight_check || isInSight(I, O))
L |= recursive_content_check(I, L, recursion_limit - 1, client_check, sight_check, include_mobs, include_objects)
L |= recursive_content_check(I, L, recursion_limit - 1, client_check, sight_check, include_mobs, include_objects, ignore_show_messages)
if(include_objects)
L |= I
+5
View File
@@ -620,3 +620,8 @@
return json_decode(data)
catch
return null
/// Removes all non-alphanumerics from the text, keep in mind this can lead to id conflicts
/proc/sanitize_css_class_name(name)
var/static/regex/regex = new(@"[^a-zA-Z0-9]","g")
return replacetext(name, regex, "")
+1 -1
View File
@@ -443,7 +443,7 @@
/datum/category_item/autolathe/arms/knuckledusters
name = "knuckle dusters"
path =/obj/item/clothing/gloves/knuckledusters
path =/obj/item/clothing/accessory/knuckledusters
hidden = 1
/datum/category_item/autolathe/arms/tacknife
+14 -12
View File
@@ -177,19 +177,21 @@
if(!is_admin())
return FALSE
var/datum/disease/D = tgui_input_list(usr, "Choose virus", "Viruses", subtypesof(/datum/disease), subtypesof(/datum/disease))
var/mob/living/carbon/human/H = null
var/disease = tgui_input_list(usr, "Choose virus", "Viruses", subtypesof(/datum/disease), subtypesof(/datum/disease))
var/mob/living/carbon/human/H = tgui_input_list(usr, "Choose infectee", human_mob_list)
if(isnull(D))
var/datum/disease/D = new disease
if(isnull(D) || isnull(H))
return FALSE
for(var/thing in shuffle(human_mob_list))
H = thing
if(H.stat == DEAD)
continue
if(!H.HasDisease(D))
H.ForceContractDisease(D)
break
if(H.stat == DEAD)
return FALSE
message_admins("[key_name_admin(usr)] has triggered a virus outbreak of [D.name]! Affected mob: [key_name_admin(H)]")
log_admin("[key_name_admin(usr)] infected [key_name_admin(H)] with [D.name]")
if(!H.HasDisease(D))
H.ForceContractDisease(D)
message_admins("[key_name_admin(usr)] has triggered a virus outbreak of [D.name]! Affected mob: [key_name_admin(H)]")
log_admin("[key_name_admin(usr)] infected [key_name_admin(H)] with [D.name]")
return TRUE
+10 -8
View File
@@ -354,20 +354,20 @@ GLOBAL_LIST_INIT(advance_cures, list(
var/new_name = tgui_input_text(usr, "Name your new disease.", "New Name")
if(!new_name)
return
return FALSE
D.AssignName(new_name)
D.Refresh()
for(var/datum/disease/advance/AD in active_diseases)
AD.Refresh()
for(var/thing in shuffle(human_mob_list))
H = thing
if(H.stat == DEAD)
continue
if(!H.HasDisease(D))
H.ForceContractDisease(D)
break
H = tgui_input_list(usr, "Choose infectee", human_mob_list)
if(isnull(H))
return FALSE
if(!H.HasDisease(D))
H.ForceContractDisease(D)
var/list/name_symptoms = list()
for(var/datum/symptom/S in D.symptoms)
@@ -375,6 +375,8 @@ GLOBAL_LIST_INIT(advance_cures, list(
message_admins("[key_name_admin(usr)] has triggered a custom virus outbreak of [D.name]! It has these symptoms: [english_list(name_symptoms)]")
log_admin("[key_name_admin(usr)] infected [key_name_admin(H)] with [D.name]. It has these symptoms: [english_list(name_symptoms)]")
return TRUE
/datum/disease/advance/proc/totalStageSpeed()
var/total_stage_speed = 0
for(var/i in symptoms)
@@ -35,6 +35,6 @@ Bonus
return
/datum/symptom/fever/proc/Heat(var/mob/living/M, var/datum/disease/advance/A)
var/get_heat = (sqrt(21+A.totalTransmittable()*2))+(sqrt(20+A.totalStageSpeed()*3))
var/get_heat = (sqrtor0(21+A.totalTransmittable()*2))+(sqrtor0(20+A.totalStageSpeed()*3))
M.bodytemperature = min(M.bodytemperature + (get_heat * A.stage), BODYTEMP_HEAT_DAMAGE_LIMIT - 1)
return TRUE
@@ -37,6 +37,6 @@ Bonus
return
/datum/symptom/flesh_eating/proc/Flesheat(mob/living/M, datum/disease/advance/A)
var/get_damage = ((sqrt(16-A.totalStealth()))*5)
var/get_damage = ((sqrtor0(16-A.totalStealth()))*5)
M.adjustBruteLoss(get_damage)
return 1
@@ -33,7 +33,7 @@ Bonus
return
/datum/symptom/heal/proc/Heal(mob/living/M, datum/disease/advance/A)
var/get_damage = (sqrt(20+A.totalStageSpeed())*(1+rand()))
var/get_damage = (sqrtor0(20+A.totalStageSpeed())*(1+rand()))
M.adjustToxLoss(-get_damage)
return TRUE
@@ -144,7 +144,7 @@ Bonus
level = 5
/datum/symptom/heal/dna/Heal(var/mob/living/carbon/M, var/datum/disease/advance/A)
var/amt_healed = (sqrt(20+A.totalStageSpeed()*(3+rand())))-(sqrt(16+A.totalStealth()*rand()))
var/amt_healed = (sqrtor0(20+A.totalStageSpeed()*(3+rand())))-(sqrtor0(16+A.totalStealth()*rand()))
M.adjustBrainLoss(-amt_healed)
M.radiation = max(M.radiation - 3, 0)
return TRUE
@@ -70,4 +70,4 @@ BONUS
phage.viruses += D
M.visible_message(span_danger("A strange crearure bursts out of [M]!"), span_userdanger("A slimy creature bursts forth from your flesh!"))
addtimer(CALLBACK(phage, TYPE_PROC_REF(/mob/living/simple_mob/vore/aggressive/macrophage, dust)), 3000)
addtimer(CALLBACK(phage, TYPE_PROC_REF(/mob/living/simple_mob/vore/aggressive/macrophage, deathcheck)), 3000)
@@ -34,6 +34,6 @@ Bonus
return
/datum/symptom/shivering/proc/Chill(mob/living/M, datum/disease/advance/A)
var/get_cold = (sqrt(16+A.totalStealth()*2))+(sqrt(21+A.totalResistance()*2))
var/get_cold = (sqrtor0(16+A.totalStealth()*2))+(sqrtor0(21+A.totalResistance()*2))
M.bodytemperature = max(M.bodytemperature - (get_cold * A.stage), BODYTEMP_COLD_DAMAGE_LIMIT + 1)
return 1
+1
View File
@@ -80,6 +80,7 @@
/obj/item/toy/plushie/slimeplushie,
/obj/item/toy/plushie/box,
/obj/item/toy/plushie/borgplushie,
/obj/item/toy/plushie/borgplushie/drake/eng,
/obj/item/toy/plushie/borgplushie/medihound,
/obj/item/toy/plushie/borgplushie/scrubpuppy,
/obj/item/toy/plushie/foxbear,
+3 -3
View File
@@ -175,7 +175,7 @@
/obj/item/material/knife/tacknife/survival,
/obj/item/material/knife/machete,
/obj/item/clothing/accessory/holster/machete,
/obj/item/clothing/gloves/watch/survival
/obj/item/clothing/accessory/watch/survival
)
cost=25
containertype = /obj/structure/closet/crate/secure/xion
@@ -200,7 +200,7 @@
/obj/item/clothing/head/pilot_vr,
/obj/item/clothing/under/rank/pilot1,
/obj/item/gun/energy/gun/protector/pilotgun/locked,
/obj/item/clothing/gloves/watch/survival
/obj/item/clothing/accessory/watch/survival
)
cost=20
containertype = /obj/structure/closet/crate/secure/xion
@@ -236,7 +236,7 @@
/obj/item/clothing/accessory/holster/machete,
/obj/item/storage/box/explorerkeys,
/obj/item/mapping_unit,
/obj/item/clothing/gloves/watch/survival
/obj/item/clothing/accessory/watch/survival
)
cost = 75
containertype = /obj/structure/closet/crate/secure/xion
-6
View File
@@ -58,12 +58,6 @@
item_cost = 20
path = /obj/item/pen/blade/fountain
/datum/uplink_item/item/stealthy_weapons/angrybuzzer
name = "Morphium Shock Ring"
desc = "An enigmatic ring used to create powerful electric shocks when punching. Can be used as a brute-force method of defibrillation."
item_cost = 40
path = /obj/item/clothing/gloves/ring/buzzer
/datum/uplink_item/item/stealthy_weapons/huntingtrap
name = "Camonetted Beartraps"
desc = "A box of unique beartraps which will partially cloak when deployed, allowing for more effective hunting."
+4
View File
@@ -48,6 +48,10 @@
title = JOB_ALT_COMPUTER_TECHNICIAN
title_blurb = "A " + JOB_ALT_COMPUTER_TECHNICIAN + " fulfills similar duties to other engineers, but specializes in working with software and computers. They also often deal with integrated circuits."
/datum/alt_title/salvage_tech
title = JOB_ALT_SALVAGE_TECHNICIAN
title_blurb = "A " + JOB_ALT_SALVAGE_TECHNICIAN + " is responsible for breaking down debris and obsolete equipment to recover useful components and materials."
/datum/job/atmos
spawn_positions = 3
pto_type = PTO_ENGINEERING
+2 -2
View File
@@ -254,19 +254,19 @@
if (!(src.status))
if(user)
visible_message(span_notice(" [user] has deactivated [src]!"))
add_hiddenprint(user)
else
visible_message(span_notice(" [src] clicks and shuts down. "))
playsound(src, 'sound/items/Wirecutter.ogg', 100, 1)
icon_state = "[initial(icon_state)]1"
add_hiddenprint(user)
else
if(user)
visible_message(span_notice(" [user] has reactivated [src]!"))
add_hiddenprint(user)
else
visible_message(span_notice(" [src] clicks and reactivates itself. "))
playsound(src, 'sound/items/Wirecutter.ogg', 100, 1)
icon_state = initial(icon_state)
add_hiddenprint(user)
/obj/machinery/camera/take_damage(var/force, var/message)
//prob(25) gives an average of 3-4 hits
@@ -22,7 +22,6 @@
/obj/item/toy/redbutton = 2,
/obj/item/toy/gnome = 2,
/obj/item/toy/AI = 2,
/obj/item/clothing/gloves/ring/buzzer/toy = 2,
/obj/item/storage/box/handcuffs/fake = 2,
/obj/item/toy/nuke = 2,
/obj/item/toy/minigibber = 2,
+67
View File
@@ -0,0 +1,67 @@
/obj/machinery/contraband_scanner
name = "contraband scanner"
gender = PLURAL
icon = 'icons/obj/atm_fieldgen.dmi'
icon_state = "arfg_off"
desc = "A simple scanner that analyzes those who pass over it, and sounds an alarm if it detects any items that are programmed into its contraband list."
anchored = TRUE
opacity = FALSE
density = FALSE
power_channel = EQUIP
use_power = USE_POWER_IDLE
idle_power_usage = 10
active_power_usage = 250
var/deep_scan = TRUE //check more than just their hands/pockets?
var/contraband_count = 0 //how many items have we detected? only one actually needs to be found to set off the alarm
var/area_lockdown = TRUE //do we set off the fire alarm for our area when triggered?
var/close_blastdoors = TRUE //close all blast doors in the area when triggered?
var/power_fields = TRUE //do we activate all ARFs when triggered? use w/ impassable fieldgens. requires area_lockdown = TRUE to do anything.
var/last_trigger //when were we last triggered? combined with the cooldown below for sanity reasons
var/cooldown = 15 SECONDS //minimum time between retriggers, so people can't spam trigger the scanner to be obnoxious
var/auto_cancel = TRUE //automatically cancel alarm states after a delay? same duration as the cooldown for sanity
var/trigger_message = "The contraband scanner has been tripped!"
var/trigger_sound = 'sound/machines/airalarm.ogg' //sound that plays when we're set off
var/list/contraband = list(/obj/item/melee,/obj/item/gun,/obj/item/material)
/obj/machinery/contraband_scanner/Crossed(mob/living/M as mob)
if(M.is_incorporeal())
return
if(isliving(M))
var/area/A = src.loc.loc
if(last_trigger > world.time - cooldown)
return
for(var/obj/O in M.contents)
if(is_type_in_list(O,contraband))
contraband_count++
if(deep_scan)
for(var/obj/O2 in O.contents) //one layer deep is fine for now I think
if(is_type_in_list(O2,contraband))
contraband_count++
if(contraband_count && last_trigger < world.time - cooldown)
visible_message(span_danger(trigger_message))
playsound(src, trigger_sound, 25, 0, 4, volume_channel = VOLUME_CHANNEL_ALARMS)
for(var/obj/machinery/contraband_scanner/CS in A)
CS.last_trigger = world.time //set everyone's trigger time at once, to cut down on spam
CS.contraband_count = 0 //clear all our contraband counts too
if(area_lockdown)
if(close_blastdoors)
for(var/obj/machinery/door/blast/B in A)
if(!B.density)
spawn(0)
B.close()
if(power_fields)
A.arfgs_activate()
if(auto_cancel)
spawn(cooldown)
if(close_blastdoors)
for(var/obj/machinery/door/blast/B in A)
if(B.density)
spawn(0)
B.open()
if(power_fields)
A.arfgs_deactivate()
..()
@@ -112,6 +112,10 @@ var/global/list/image/splatter_cache=list()
var/obj/structure/bed/chair/wheelchair/W = perp.buckled
W.bloodiness = 4
if(viruses)
for(var/datum/disease/D in viruses)
perp.ContractDisease(D)
amount--
/obj/effect/decal/cleanable/blood/proc/dry()
@@ -124,6 +128,11 @@ var/global/list/image/splatter_cache=list()
..()
if (amount && istype(user))
add_fingerprint(user)
if(viruses)
for(var/datum/disease/D in viruses)
user.ContractDisease(D)
if (user.gloves)
return
var/taken = rand(1,amount)
@@ -258,4 +267,14 @@ var/global/list/image/splatter_cache=list()
viruses.Cut()
return ..()
/obj/effect/decal/cleanable/mucus/Crossed(mob/living/carbon/human/perp)
if(viruses)
for(var/datum/disease/D in viruses)
perp.ContractDisease(D)
/obj/effect/decal/cleanable/vomit/Crossed(mob/living/carbon/human/perp)
if(viruses)
for(var/datum/disease/D in viruses)
perp.ContractDisease(D)
#undef DRYING_TIME
@@ -118,7 +118,6 @@
to speak with your team, and learn what their plan is for today."))
R.key = C.key
// R.Namepick() // Apparnetly making someone a merc lets them pick a name, so this isn't needed.
spawn(1)
mercs.add_antagonist(R.mind, FALSE, TRUE, FALSE, FALSE, FALSE)
@@ -28,10 +28,10 @@
disrupt()
..()
/obj/item/chameleon/attack_self()
toggle()
/obj/item/chameleon/attack_self(mob/user)
toggle(user)
/obj/item/chameleon/afterattack(atom/target, mob/user , proximity)
/obj/item/chameleon/afterattack(atom/target, mob/user, proximity)
if(!proximity) return
if(!active_dummy)
if(istype(target,/obj/item) && !istype(target, /obj/item/disk/nuclear))
@@ -42,30 +42,32 @@
saved_icon_state = target.icon_state
saved_overlays = target.overlays
/obj/item/chameleon/proc/toggle()
/obj/item/chameleon/proc/toggle(mob/user)
if(!can_use || !saved_item) return
if(active_dummy)
eject_all()
playsound(src, 'sound/effects/pop.ogg', 100, 1, -6)
qdel(active_dummy)
active_dummy = null
to_chat(usr, span_notice("You deactivate the [src]."))
to_chat(user, span_notice("You deactivate the [src]."))
var/obj/effect/overlay/T = new /obj/effect/overlay(get_turf(src))
T.icon = 'icons/effects/effects.dmi'
flick("emppulse",T)
spawn(8) qdel(T)
addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), T), 0.8 SECONDS, TIMER_DELETE_ME)
else
playsound(src, 'sound/effects/pop.ogg', 100, 1, -6)
var/obj/O = new saved_item(src)
if(!O) return
var/obj/effect/dummy/chameleon/C = new /obj/effect/dummy/chameleon(usr.loc)
C.activate(O, usr, saved_icon, saved_icon_state, saved_overlays, src)
if(istype(user.loc, /obj/item/holder)) // This doesn't go well...
return
var/obj/effect/dummy/chameleon/C = new /obj/effect/dummy/chameleon(user.loc)
C.activate(O, user, saved_icon, saved_icon_state, saved_overlays, src)
qdel(O)
to_chat(usr, span_notice("You activate the [src]."))
to_chat(user, span_notice("You activate the [src]."))
var/obj/effect/overlay/T = new/obj/effect/overlay(get_turf(src))
T.icon = 'icons/effects/effects.dmi'
flick("emppulse",T)
spawn(8) qdel(T)
addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), T), 0.8 SECONDS, TIMER_DELETE_ME)
/obj/item/chameleon/proc/disrupt(var/delete_dummy = 1)
if(active_dummy)
@@ -78,7 +80,10 @@
qdel(active_dummy)
active_dummy = null
can_use = 0
spawn(50) can_use = 1
addtimer(CALLBACK(src, PROC_REF(allow_use)), 5 SECONDS, TIMER_DELETE_ME)
/obj/item/chameleon/proc/allow_use()
can_use = 1
/obj/item/chameleon/proc/eject_all()
for(var/atom/movable/A in active_dummy)
@@ -127,6 +132,9 @@
..()
master.disrupt()
/obj/effect/dummy/chameleon/proc/allow_move()
can_move = 1
/obj/effect/dummy/chameleon/relaymove(var/mob/user, direction)
if(istype(loc, /turf/space)) return //No magical space movement!
@@ -134,15 +142,15 @@
can_move = 0
switch(user.bodytemperature)
if(300 to INFINITY)
spawn(10) can_move = 1
addtimer(CALLBACK(src, PROC_REF(allow_move)), 1 SECOND, TIMER_DELETE_ME)
if(295 to 300)
spawn(13) can_move = 1
addtimer(CALLBACK(src, PROC_REF(allow_move)), 1.3 SECONDS, TIMER_DELETE_ME)
if(280 to 295)
spawn(16) can_move = 1
addtimer(CALLBACK(src, PROC_REF(allow_move)), 1.6 SECONDS, TIMER_DELETE_ME)
if(260 to 280)
spawn(20) can_move = 1
addtimer(CALLBACK(src, PROC_REF(allow_move)), 2 SECONDS, TIMER_DELETE_ME)
else
spawn(25) can_move = 1
addtimer(CALLBACK(src, PROC_REF(allow_move)), 2.5 SECONDS, TIMER_DELETE_ME)
step(src, direction)
return
@@ -576,6 +576,18 @@
syndie = 1
ks1type = /obj/item/encryptionkey/syndicate
/obj/item/radio/headset/alt/syndicate
origin_tech = list(TECH_ILLEGAL = 3)
icon_state = "syndie_headset_alt"
syndie = 1
ks1type = /obj/item/encryptionkey/syndicate
/obj/item/radio/headset/earbud/syndicate
origin_tech = list(TECH_ILLEGAL = 3)
icon_state = "syndie_earbud"
syndie = 1
ks1type = /obj/item/encryptionkey/syndicate
/obj/item/radio/headset/raider
origin_tech = list(TECH_ILLEGAL = 2)
icon_state = "syndie_headset"
@@ -248,7 +248,7 @@
else
dat += span_warning("Unknown substance[(unknown > 1)?"s":""] found in subject's dermis.")
dat += "<br>"
if(C.resistances.len)
if(LAZYLEN(C.resistances))
for (var/datum/disease/virus in C.GetViruses())
if(virus.visibility_flags & HIDDEN_SCANNER || virus.visibility_flags & HIDDEN_PANDEMIC)
continue
+54
View File
@@ -0,0 +1,54 @@
//For bypassing locked /obj/structure/simple_doors
/obj/item/lockpick
name = "set of lockpicks"
desc = "A set of picks and tension wrenches, ideal for picking old-style mechanical locks... not that any of those exist on most NT facilities these days. Still, it might be useful elsewhere?"
icon = 'icons/obj/lockpicks.dmi'
icon_state = "lockpicks"
w_class = ITEMSIZE_SMALL
var/pick_type = "simple"
var/pick_time = 10 SECONDS
var/pick_verb = "pick"
/obj/item/lockpick/afterattack(atom/A, mob/user)
if(!user.IsAdvancedToolUser()) //no lockpicking for monkeys
return
if(istype(A, /obj/structure/simple_door))
var/obj/structure/simple_door/D = A
if(!D.locked) //you can pick your nose, but you can't pick an unlocked door
to_chat(user, span_notice("\The [D] isn't locked."))
return
else if(D.lock_type != pick_type) //make sure our types match
to_chat(user, span_warning("\The [src] can't pick \the [D]. Another tool might work?"))
return
else if(!D.can_pick) //make sure we're actually allowed to bypass it at all
to_chat(user, span_warning("\The [D] can't be [pick_verb]ed."))
return
else //finally, we can assume that they do match
to_chat(user, span_notice("You start to [pick_verb] the lock on \the [D]..."))
playsound(src, D.keysound,100, 1)
if(do_after(user, pick_time * D.lock_difficulty))
to_chat(user, span_notice("Success!"))
D.locked = FALSE
else if(istype(A,/mob/living/carbon/human)) //you can pick your friends, and you can pick your nose, but you can't pick your friend's nose
var/mob/living/carbon/human/H = A
if(user.zone_sel.selecting == BP_HEAD)
if(H == user)
to_chat(user, span_notice("Your nose isn't locked. If you're feeling stuffy, maybe you should talk to a doctor..?"))
else
user.visible_message(span_notice("[user] tries to [pick_verb] [H]'s nose with \the [src]! They don't seem to be having much success."),span_notice("You try to [pick_verb] [H]'s nose. It doesn't seem to be working."))
return
/obj/item/lockpick/pick_gun
name = "pick gun"
desc = "A more sophisticated and automated alternative to traditional lockpicking methods. Contains a dazzling array of tools in a simple-to-use housing: just press the face plate against the lock face and hold the trigger down until it goes click."
icon_state = "pick_gun"
pick_time = 3 SECONDS
/obj/item/lockpick/mag_sequencer
name = "magnetic sequencer"
desc = "A deceptively simple gadget that brute-forces magnetic locks using a small electromagnet. A predecessor to the cryptographic sequencer, a more complicated device that is considered contraband in most jurisdictions. Not that these aren't illegal either, mind you!"
icon_state = "mag_sequencer"
pick_type = "maglock"
pick_time = 5 SECONDS
pick_verb = "bypass"
@@ -225,7 +225,6 @@
feedback_inc("cyborg_birth",1)
callHook("borgify", list(O))
O.namepick()
qdel(src)
else
-29
View File
@@ -556,35 +556,6 @@
/obj/item/toy/AI/proc/cooldownreset()
cooldown = 0
/*
* Hand buzzer
*/
/obj/item/clothing/gloves/ring/buzzer/toy
name = "steel ring"
desc = "Torus shaped finger decoration. It has a small piece of metal on the palm-side."
icon_state = "seal-signet"
drop_sound = 'sound/items/drop/ring.ogg'
/obj/item/clothing/gloves/ring/buzzer/toy/Touch(var/atom/A, var/proximity)
if(proximity && istype(usr, /mob/living/carbon/human))
return zap(usr, A, proximity)
return 0
/obj/item/clothing/gloves/ring/buzzer/toy/zap(var/mob/living/carbon/human/user, var/atom/movable/target, var/proximity)
. = FALSE
if(user.a_intent == I_HELP && battery.percent() >= 50)
if(isliving(target))
var/mob/living/L = target
to_chat(L, span_warning("You feel a powerful shock!"))
if(!.)
playsound(L, 'sound/effects/sparks7.ogg', 40, 1)
L.electrocute_act(battery.percent() * 0, src)
return .
return 0
/*
* Toy cuffs
*/
+21 -1
View File
@@ -16,4 +16,24 @@
else
M.ClearTransform()
M.update_transform()
return ..()
return ..()
// Do not ever just leave this laying about, it will go horribly wrong!
/obj/item/squishhammer/dark
name = "The Dark Short Stacker"
desc = "Wield the power of this weapon with responsibility (God knows you won't)."
icon = 'icons/obj/items.dmi'
icon_state = "dark_hammer"
attack_verb = list("stacked")
force = 0
throwforce = 0
/obj/item/squishhammer/dark/attack(mob/M as mob, mob/user as mob)
..()
var/mob/living/carbon/human/H = M
if(istype(H))
for(var/obj/item/organ/external/E in H.organs)
E.fracture() // Oof, ouch, owie
var/turf/T = M.loc
if(isturf(T))
new /obj/effect/gibspawner/generic(T)
@@ -108,12 +108,12 @@
if(M == user)
if(!M.can_eat(loaded))
return
M.visible_message(span_bold("\The [user]") + "eats some of [loaded] with \the [src].")
M.visible_message(span_bold("\The [user]") + " eats some of [loaded] with \the [src].")
else
user.visible_message(span_warning("\The [user] begins to feed \the [M]!"))
if(!(M.can_force_feed(user, loaded) && do_mob(user, M, 5 SECONDS)))
return
M.visible_message(span_bold("\The [user]") + "feeds some of [loaded] to \the [M] with \the [src].")
M.visible_message(span_bold("\The [user]") + " feeds some of [loaded] to \the [M] with \the [src].")
playsound(src,'sound/items/eatfood.ogg', rand(10,40), 1)
loaded = null
update_icon()
@@ -65,8 +65,7 @@
var/light_glove_d = rand(2, 4)
var/no_glove_d = rand(4, 6)
var/list/forbidden_gloves = list(
/obj/item/clothing/gloves/sterile,
/obj/item/clothing/gloves/knuckledusters
/obj/item/clothing/gloves/sterile
)
if(src == user.l_hand)
@@ -13,4 +13,42 @@
sharp = TRUE
edge = FALSE
attack_verb = list("stabbed", "lunged at", "dextrously struck", "sliced", "lacerated", "impaled", "diced", "charioted")
hitsound = 'sound/weapons/bladeslice.ogg'
hitsound = 'sound/weapons/bladeslice.ogg'
/obj/item/melee/hammer
name = "claw hammer"
desc = "A simple claw hammer for hitting things or people with, and the claw part probably does something too."
icon = 'icons/obj/weapons.dmi'
icon_state = "claw_hammer"
force = 15
throwforce = 10
w_class = ITEMSIZE_SMALL
attack_verb = list("smashed", "swung at", "pummelled", "nailed", "crushed", "bonked", "hammered", "cracked")
defend_chance = 0
/obj/item/melee/hammer/apply_hit_effect(mob/living/target, mob/living/user, var/hit_zone, var/attack_modifier)
if(istype(target,/mob/living/carbon/human))
var/mob/living/carbon/human/H = target
if(prob(50))
var/obj/item/organ/external/affecting = H.get_organ(hit_zone)
affecting.fracture()
return ..()
/obj/item/melee/hammer/afterattack(atom/A as mob|obj|turf|area, mob/user as mob, proximity)
if(!proximity) return
..()
if(A)
if(istype(A,/obj/structure/window))
var/obj/structure/window/W = A
if(prob(50))
W.visible_message(span_warning("\The [W] shatters under the force of the impact!"))
W.shatter()
else if(istype(A,/obj/structure/barricade))
var/obj/structure/barricade/B = A
if(prob(50))
B.visible_message(span_warning("\The [B] is broken apart with ease!"))
B.dismantle()
else if(istype(A,/obj/structure/grille))
if(prob(50))
A.visible_message(span_warning("\The [A] is smashed open!"))
qdel(A)
@@ -141,7 +141,7 @@
to_chat(user, span_notice("\the [src] is too full to possibly fit anything else inside of it."))
return
if (istype(W, /obj/item/ore))
if (istype(W, /obj/item/ore) && !istype(W, /obj/item/ore/slag))
var/obj/item/ore/ore = W
stored_ore[ore.material]++
current_capacity++
@@ -178,6 +178,8 @@
if(current_pickup >= max_pickup)
max_pickup_reached = 1
break
if(istype(O, /obj/item/ore/slag))
continue
var/obj/item/ore/ore = O
stored_ore[ore.material]++
current_capacity++
+1 -1
View File
@@ -263,7 +263,7 @@
prob(6);/obj/item/material/butterflyblade,
prob(6);/obj/item/material/butterflyhandle,
prob(2);/obj/item/material/butterfly/switchblade,
prob(2);/obj/item/clothing/gloves/knuckledusters,
prob(2);/obj/item/clothing/accessory/knuckledusters,
prob(1);/obj/item/material/knife/tacknife,
prob(1);/obj/item/clothing/suit/storage/vest/heavy/merc,
prob(1);/obj/item/beartrap,
+1 -1
View File
@@ -154,7 +154,7 @@
prob(4);/obj/item/storage/pill_bottle/zoom,
prob(4);/obj/item/material/butterfly,
prob(2);/obj/item/material/butterfly/switchblade,
prob(2);/obj/item/clothing/gloves/knuckledusters,
prob(2);/obj/item/clothing/accessory/knuckledusters,
prob(2);/obj/item/reagent_containers/syringe/drugs,
prob(1);/obj/item/material/knife/tacknife,
prob(1);/obj/item/clothing/suit/storage/vest/heavy/merc,
@@ -211,7 +211,7 @@
/obj/item/radio,
/obj/item/gps/explorer,
/obj/item/gun/energy/gun/protector/pilotgun/locked,
/obj/item/clothing/gloves/watch/survival,
/obj/item/clothing/accessory/watch/survival,
/obj/item/clothing/accessory/storage/webbing/pilot1,
/obj/item/clothing/accessory/storage/webbing/pilot2,
/obj/item/emergency_beacon
@@ -31,7 +31,6 @@
from the pod is not a crewmember."))
R.ckey = M.ckey
visible_message(span_warning("As \the [src] opens, the eyes of the robot flicker as it is activated."))
R.namepick()
log_and_message_admins("successfully opened \a [src] and got a Lost Drone.")
..()
@@ -57,7 +56,6 @@
definiton of 'your gravesite' is where your pod is."))
R.ckey = M.ckey
visible_message(span_warning("As \the [src] opens, the eyes of the robot flicker as it is activated."))
R.namepick()
..()
/obj/structure/ghost_pod/ghost_activated/swarm_drone
@@ -21,7 +21,6 @@
from the pod is not a crewmember."))
R.ckey = M.ckey
visible_message(span_warning("As \the [src] opens, the eyes of the robot flicker as it is activated."))
R.namepick()
log_and_message_admins("successfully opened \a [src] and got a Lost Drone.")
used = TRUE
return TRUE
+97 -11
View File
@@ -556,9 +556,9 @@
* This one is a bit more fancy than others. Anything in the contents (PLEASE LIMIT TO ONE THING)
* will show up inside it! Also if you map in an item on it, it will grab that at mapload and start
* in the 'closed, full of fluid' state, so you can put a body on it or whatever.
*
*
* As an aghost you can also dragdrop something into it (you have to be ghosted next to it)
*
*
* Possible 'state' options for change_state(state) are:
* open: Open, no fluid or anything. At the end the contents are ejected.
* closed: Closed, full of liquid
@@ -582,7 +582,7 @@
/obj/structure/prop/machine/nt_pod/Initialize(mapload)
// Our non-map-preview state
icon_state = "nt_pod"
// Alpha mask to make sure things don't sneak out
var/obj/effect/overlay/vis/mask = new
mask.icon = icon
@@ -607,7 +607,7 @@
// Save old settings
contents_vis_flags = AM.vis_flags
contents_original_pixel_y = AM.pixel_y
// Arrange
AM.add_filter("podmask", 1, alpha_mask_filter(render_source = "nt_podmask[REF(src)]", flags = MASK_INVERSE))
AM.pixel_y = 12
@@ -616,7 +616,7 @@
if(ismob(AM))
var/mob/M = AM
buckle_mob(M, TRUE, FALSE)
// TRAP THEM
change_state("closed")
@@ -639,7 +639,7 @@
return
if(!user.client?.holder)
return
AM.forceMove(src)
/obj/structure/prop/machine/nt_pod/change_state(state)
@@ -648,17 +648,17 @@
if("open")
cut_overlay("nt_pod_top_on")
cut_overlay("nt_pod_under")
// Fluid drains
fluid.icon_state = "nothing"
flick("nt_pod_emptying", fluid) // 8ds
sleep(8)
// Door opens
door.icon_state = "nothing"
flick("nt_pod_opening", door) // 9ds
sleep(9)
// GET OUT
outside.layer = BELOW_MOB_LAYER
if(contents.len)
@@ -670,7 +670,7 @@
cut_overlay("nt_pod_top_on")
add_overlay("nt_pod_top_on")
add_overlay("nt_pod_under")
// Door closes
door.icon_state = "nt_pod_glass"
flick("nt_pod_closing", door) // 9ds
@@ -683,4 +683,90 @@
cut_overlay("nt_pod_panel")
add_overlay("nt_pod_panel")
if("panel_closed")
cut_overlay("nt_pod_panel")
cut_overlay("nt_pod_panel")
// Old Virology stuff
/obj/structure/prop/machine/centrifuge
name = "centrifuge"
desc = "Used to separate things with different weight. Spin 'em round, round, right round."
icon = 'icons/obj/virology_vr.dmi'
icon_state = "centrifuge"
var/on = FALSE
/obj/structure/prop/machine/centrifuge/attack_hand(mob/user as mob)
..()
if(!on)
on = TRUE
user.visible_message("\The [user] turns on \the [src].")
icon_state = "centrifuge_moving"
else
on = FALSE
user.visible_message("\The [user] turns off \the [src].")
icon_state = "centrifuge"
update_icon()
/obj/structure/prop/machine/incubator
name = "incubator"
desc = "Encourages the growth of diseases. This model comes with a dispenser system and a small radiation generator."
icon = 'icons/obj/virology_vr.dmi'
icon_state = "incubator"
var/on = FALSE
/obj/structure/prop/machine/incubator/attack_hand(mob/user as mob)
..()
if(!on)
on = TRUE
user.visible_message("\The [user] turns on \the [src].")
icon_state = "incubator_on"
else
on = FALSE
user.visible_message("\The [user] turns off \the [src].")
icon_state = "incubator"
update_icon()
/obj/structure/prop/machine/disease_analyser
name = "disease analyser"
desc = "Analyzes diseases to find out information about them!"
icon = 'icons/obj/virology_vr.dmi'
icon_state = "analyser"
var/on = FALSE
/obj/structure/prop/machine/disease_analyser/attack_hand(mob/user as mob)
..()
if(!on)
on = TRUE
user.visible_message("\The [user] turns on \the [src].")
icon_state = "analyser_"
else
on = FALSE
user.visible_message("\The [user] turns off \the [src].")
icon_state = "analyser"
update_icon()
/obj/structure/prop/machine/isolator
name = "disease isolator"
desc = "Used to isolate and identify diseases, allowing for comparison with a remote database."
icon = 'icons/obj/virology_vr.dmi'
icon_state = "isolator_in"
var/on = FALSE
/obj/structure/prop/machine/isolator/attack_hand(mob/user as mob)
..()
if(!on)
on = TRUE
user.visible_message("\The [user] turns on \the [src].")
icon_state = "isolator_"
else
on = FALSE
user.visible_message("\The [user] turns off \the [src].")
icon_state = "isolator_in"
update_icon()
@@ -18,6 +18,9 @@
var/locked = FALSE //has the door been locked?
var/lock_id = null //does the door have an associated key?
var/lock_type = "simple" //string matched to "pick_type" on /obj/item/lockpick
var/can_pick = TRUE //can it be picked/bypassed?
var/lock_difficulty = 1 //multiplier to picking/bypassing time
var/keysound = 'sound/items/toolbelt_equip.ogg'
/obj/structure/simple_door/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
@@ -292,7 +292,7 @@
prob(3);/obj/item/cracker,
prob(3);/obj/item/material/butterfly,
prob(3);/obj/item/material/butterfly/switchblade,
prob(3);/obj/item/clothing/gloves/knuckledusters,
prob(3);/obj/item/clothing/accessory/knuckledusters,
prob(3);/obj/item/clothing/gloves/heavy_engineer,
prob(3);/obj/item/reagent_containers/syringe/drugs,
prob(2);/obj/item/implanter/sizecontrol,
+13 -7
View File
@@ -43,9 +43,16 @@
qdel(source)
. = ..()
/datum/eventkit/modify_robot/ui_assets(mob/user)
return list(
get_asset_datum(/datum/asset/spritesheet/robot_icons)
)
/datum/eventkit/modify_robot/tgui_data(mob/user)
. = list()
// Target section for general data
var/datum/asset/spritesheet/robot_icons/spritesheet = get_asset_datum(/datum/asset/spritesheet/robot_icons)
if(target)
.["target"] = list()
.["target"]["name"] = target.name
@@ -62,10 +69,8 @@
// Target section for options once a module has been selected
if(target.module)
.["target"]["active"] = target.icon_selected
.["target"]["front"] = icon2base64(get_flat_icon(target,dir=SOUTH,no_anim=TRUE))
.["target"]["side"] = icon2base64(get_flat_icon(target,dir=WEST,no_anim=TRUE))
.["target"]["side_alt"] = icon2base64(get_flat_icon(target,dir=EAST,no_anim=TRUE))
.["target"]["back"] = icon2base64(get_flat_icon(target,dir=NORTH,no_anim=TRUE))
.["target"]["sprite"] = sanitize_css_class_name("[target.sprite_datum.type]")
.["target"]["sprite_size"] = spritesheet.icon_size_id(.["target"]["sprite"] + "S")
.["target"]["modules"] = get_target_items(user)
var/list/module_options = list()
for(var/module in robot_modules)
@@ -110,7 +115,7 @@
.["access_options"] = access_options
// Section for source data for the module we might want to salvage
if(source)
.["source"] += get_module_source(user)
.["source"] += get_module_source(user, spritesheet)
var/list/all_robots = list()
for(var/mob/living/silicon/robot/R in silicon_mob_list)
if(!R.loc)
@@ -573,10 +578,11 @@
target_items += list(list("name" = item.name, "ref" = "\ref[item]", "icon" = icon2html(item, user, sourceonly=TRUE), "desc" = item.desc))
return target_items
/datum/eventkit/modify_robot/proc/get_module_source(var/mob/user)
/datum/eventkit/modify_robot/proc/get_module_source(var/mob/user, var/datum/asset/spritesheet/robot_icons/spritesheet)
var/list/source_list = list()
source_list["model"] = source.module
source_list["front"] = icon2base64(get_flat_icon(source,dir=SOUTH,no_anim=TRUE))
source_list["sprite"] = sanitize_css_class_name("[source.sprite_datum.type]")
source_list["sprite_size"] = spritesheet.icon_size_id(source_list["sprite"] + "S")
var/list/source_items = list()
for(var/obj/item in (source.module.modules | source.module.emag))
var/exists
@@ -437,6 +437,45 @@
Insert("bottle-[i]", 'icons/obj/chemical.dmi', "bottle-[i]")
// Robot UI sprites
/datum/asset/spritesheet/robot_icons
name = "robot_icons"
/datum/asset/spritesheet/robot_icons/create_spritesheets()
for(var/datum/robot_sprite/S as anything in typesof(/datum/robot_sprite))
if(!S.name || !S.sprite_icon_state) // snowflake out those customs... they suck
continue
var/icon/I_N = icon(S.sprite_icon, S.sprite_icon_state, NORTH)
var/icon/I_S = icon(S.sprite_icon, S.sprite_icon_state, SOUTH)
var/icon/I_W = icon(S.sprite_icon, S.sprite_icon_state, WEST)
var/icon/I_E = icon(S.sprite_icon, S.sprite_icon_state, EAST)
if(S.has_eye_sprites)
var/icon/I_NE = icon(S.sprite_icon, "[S.sprite_icon_state]-eyes", NORTH)
if(I_NE)
I_N.Blend(I_NE, ICON_OVERLAY)
if(S.has_eye_sprites)
var/icon/I_SE = icon(S.sprite_icon, "[S.sprite_icon_state]-eyes", SOUTH)
if(I_SE)
I_S.Blend(I_SE, ICON_OVERLAY)
if(S.has_eye_sprites)
var/icon/I_WE = icon(S.sprite_icon, "[S.sprite_icon_state]-eyes", WEST)
if(I_WE)
I_W.Blend(I_WE, ICON_OVERLAY)
if(S.has_eye_sprites)
var/icon/I_EE = icon(S.sprite_icon, "[S.sprite_icon_state]-eyes", EAST)
if(I_EE)
I_E.Blend(I_EE, ICON_OVERLAY)
var/imgid = sanitize_css_class_name("[S.type]")
I_N.Scale(120, 120)
I_S.Scale(120, 120)
I_W.Scale(120, 120)
I_E.Scale(120, 120)
Insert(imgid + "N", I_N)
Insert(imgid + "S", I_S)
Insert(imgid + "W", I_W)
Insert(imgid + "E", I_E)
//Cloning pod sprites for UIs
/datum/asset/simple/cloning
assets = list(
@@ -360,18 +360,18 @@
/datum/gear/accessory/wristband_collection
display_name = "wristbands (selection)"
path = /obj/item/clothing/accessory/wristbandcollection
path = /obj/item/clothing/accessory/wristband/collection
/datum/gear/accessory/wristband_collection/New()
..()
var/list/wristband_lists = list(
"Green, Blue and Yellow" = /obj/item/clothing/accessory/wristbandcollection,
"Pink, Black and Red" = /obj/item/clothing/accessory/wristbandcollection/pink,
"Red and Orange" = /obj/item/clothing/accessory/wristbandcollection/les,
"White, Pink and Blue" = /obj/item/clothing/accessory/wristbandcollection/trans,
"Blue, Purple and Pink" = /obj/item/clothing/accessory/wristbandcollection/bi,
"Black, White and Grey" = /obj/item/clothing/accessory/wristbandcollection/ace,
"Spiked" = /obj/item/clothing/accessory/wristband_spiked
"Green, Blue and Yellow" = /obj/item/clothing/accessory/wristband/collection,
"Pink, Black and Red" = /obj/item/clothing/accessory/wristband/collection/pink,
"Red and Orange" = /obj/item/clothing/accessory/wristband/collection/les,
"White, Pink and Blue" = /obj/item/clothing/accessory/wristband/collection/trans,
"Blue, Purple and Pink" = /obj/item/clothing/accessory/wristband/collection/bi,
"Black, White and Grey" = /obj/item/clothing/accessory/wristband/collection/ace,
"Spiked" = /obj/item/clothing/accessory/wristband/spiked
)
gear_tweaks += new/datum/gear_tweak/path(wristband_lists)
@@ -271,7 +271,7 @@
// C CKEYS
/datum/gear/fluff/cappy_watch
path = /obj/item/clothing/accessory/watch
path = /obj/item/clothing/accessory/watch/custom
display_name = "Cappy's Pocket Watch"
ckeywhitelist = list("cappycat")
character_name = list("Cappy Fuzzlyfeathers")
@@ -528,7 +528,7 @@
character_name = list("Elizabeth Bayou")
/datum/gear/fluff/mercury_vopal_ring
path = /obj/item/clothing/gloves/ring/material/void_opal/fluff/mercury
path = /obj/item/clothing/accessory/ring/material/void_opal/fluff/mercury
display_name = "Mercury's Mate Ring"
ckeywhitelist = list("haloren")
character_name = list("Mercury")
@@ -694,6 +694,12 @@
ckeywhitelist = list("john.wayne9392")
character_name = list("Harmony Pretchl")
/datum/gear/fluff/vox_dylo_pills
path = /obj/item/storage/pill_bottle/dylovene
display_name = "Dylovene pill bottle"
ckeywhitelist = list("jparker890")
character_name = list("Krey-Timinine")
/datum/gear/fluff/koyo_box
path = /obj/item/storage/box/fluff/koyoakimomi
display_name = "Koyo's Box"
@@ -1239,6 +1245,13 @@
ckeywhitelist = list("satinisle")
character_name = list("Parriz Tavakdavi")
/datum/gear/fluff/dark_tarot
path = /obj/item/deck/dark_tarot
display_name = "dark rose tarot deck"
ckeywhitelist = list("satinisle")
character_name = list("Millie Orlen")
// T CKEYS
/datum/gear/fluff/ascian_medal
path = /obj/item/clothing/accessory/medal/silver/unity/tabiranth
@@ -56,7 +56,6 @@
toytype["Big Red Button"] = /obj/item/toy/redbutton
toytype["Garden gnome"] = /obj/item/toy/gnome
toytype["Toy AI"] = /obj/item/toy/AI
toytype["Hand buzzer"] = /obj/item/clothing/gloves/ring/buzzer/toy
toytype["Toy nuke"] = /obj/item/toy/nuke
toytype["Toy gibber"] = /obj/item/toy/minigibber
toytype["Toy xeno"] = /obj/item/toy/toy_xeno
@@ -74,27 +74,27 @@
/datum/gear/gloves/ring
display_name = "ring selection"
description = "Choose from a number of rings."
path = /obj/item/clothing/gloves/ring
path = /obj/item/clothing/accessory/ring
cost = 1
/datum/gear/gloves/ring/New()
..()
var/ringtype = list()
ringtype["CTI ring"] = /obj/item/clothing/gloves/ring/cti
ringtype["Mariner University ring"] = /obj/item/clothing/gloves/ring/mariner
ringtype["engagement ring"] = /obj/item/clothing/gloves/ring/engagement
ringtype["signet ring"] = /obj/item/clothing/gloves/ring/seal/signet
ringtype["masonic ring"] = /obj/item/clothing/gloves/ring/seal/mason
ringtype["ring, glass"] = /obj/item/clothing/gloves/ring/material/glass
ringtype["ring, wood"] = /obj/item/clothing/gloves/ring/material/wood
ringtype["ring, plastic"] = /obj/item/clothing/gloves/ring/material/plastic
ringtype["ring, iron"] = /obj/item/clothing/gloves/ring/material/iron
ringtype["ring, bronze"] = /obj/item/clothing/gloves/ring/material/bronze
ringtype["ring, steel"] = /obj/item/clothing/gloves/ring/material/steel
ringtype["ring, copper"] = /obj/item/clothing/gloves/ring/material/copper
ringtype["ring, silver"] = /obj/item/clothing/gloves/ring/material/silver
ringtype["ring, gold"] = /obj/item/clothing/gloves/ring/material/gold
ringtype["ring, platinum"] = /obj/item/clothing/gloves/ring/material/platinum
ringtype["CTI ring"] = /obj/item/clothing/accessory/ring/cti
ringtype["Mariner University ring"] = /obj/item/clothing/accessory/ring/mariner
ringtype["engagement ring"] = /obj/item/clothing/accessory/ring/engagement
ringtype["signet ring"] = /obj/item/clothing/accessory/ring/seal/signet
ringtype["masonic ring"] = /obj/item/clothing/accessory/ring/seal/mason
ringtype["ring, glass"] = /obj/item/clothing/accessory/ring/material/glass
ringtype["ring, wood"] = /obj/item/clothing/accessory/ring/material/wood
ringtype["ring, plastic"] = /obj/item/clothing/accessory/ring/material/plastic
ringtype["ring, iron"] = /obj/item/clothing/accessory/ring/material/iron
ringtype["ring, bronze"] = /obj/item/clothing/accessory/ring/material/bronze
ringtype["ring, steel"] = /obj/item/clothing/accessory/ring/material/steel
ringtype["ring, copper"] = /obj/item/clothing/accessory/ring/material/copper
ringtype["ring, silver"] = /obj/item/clothing/accessory/ring/material/silver
ringtype["ring, gold"] = /obj/item/clothing/accessory/ring/material/gold
ringtype["ring, platinum"] = /obj/item/clothing/accessory/ring/material/platinum
gear_tweaks += new/datum/gear_tweak/path(ringtype)
@@ -105,14 +105,14 @@
/datum/gear/gloves/watch
display_name = "wristwatch selector"
description = "Pick from a range of wristwatches."
path = /obj/item/clothing/gloves/watch
path = /obj/item/clothing/accessory/watch
/datum/gear/gloves/watch/New()
..()
var/list/selector_watches = list(
"plain plastic"=/obj/item/clothing/gloves/watch,
"silver"=/obj/item/clothing/gloves/watch/silver,
"gold"=/obj/item/clothing/gloves/watch/gold,
"survival"=/obj/item/clothing/gloves/watch/survival
"plain plastic"=/obj/item/clothing/accessory/watch,
"silver"=/obj/item/clothing/accessory/watch/silver,
"gold"=/obj/item/clothing/accessory/watch/gold,
"survival"=/obj/item/clothing/accessory/watch/survival
)
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_watches))
@@ -1,10 +1,10 @@
/datum/gear/gloves/goldring
display_name = "wedding ring, gold"
path = /obj/item/clothing/gloves/ring/wedding
path = /obj/item/clothing/accessory/ring/wedding
/datum/gear/gloves/silverring
display_name = "wedding ring, silver"
path = /obj/item/clothing/gloves/ring/wedding/silver
path = /obj/item/clothing/accessory/ring/wedding/silver
/datum/gear/gloves/colored
display_name = "gloves, colorable"
+1 -1
View File
@@ -7,7 +7,7 @@
var/list/Lines = list()
if(holder)
if(check_rights(R_ADMIN|R_SERVER|R_MOD,FALSE,src))
for(var/client/C in GLOB.clients)
var/entry = "<tr><td>[C.key]"
if(C.holder && C.holder.fakekey)
@@ -12,6 +12,8 @@
var/image/inv_overlay = null // Overlay used when attached to clothing.
var/image/mob_overlay = null
var/overlay_state = null
var/punch_force = 0 // added melee damage
var/punch_damtype = BRUTE // added melee damage type
var/concealed_holster = 0
var/mob/living/carbon/human/wearer = null // To check if the wearer changes, so species spritesheets change properly.
var/list/on_rolled = list() // Used when jumpsuit sleevels are rolled ("rolled" entry) or it's rolled down ("down"). Set to "none" to hide in those states.
@@ -82,6 +84,11 @@
src.forceMove(S)
has_suit.add_overlay(get_inv_overlay())
has_suit.force += force
if(istype(S,/obj/item/clothing/gloves))
var/obj/item/clothing/gloves/has_gloves = S
has_gloves.punch_force = has_gloves.punch_force + punch_force
if(user)
to_chat(user, span_notice("You attach \the [src] to \the [has_suit]."))
add_fingerprint(user)
@@ -90,6 +97,10 @@
if(!has_suit)
return
has_suit.cut_overlay(get_inv_overlay())
has_suit.force = initial(has_suit.force)
if(istype(has_suit,/obj/item/clothing/gloves))
var/obj/item/clothing/gloves/has_gloves = has_suit
has_gloves.punch_force = initial(has_gloves.punch_force)
has_suit = null
if(user)
usr.put_in_hands(src)
@@ -376,85 +387,6 @@
icon_state = "tesh_neckscarf"
species_restricted = list(SPECIES_TESHARI)
//bracelets
/obj/item/clothing/accessory/bracelet
name = "bracelet"
desc = "A simple silver bracelet with a clasp."
icon = 'icons/inventory/accessory/item.dmi'
icon_state = "bracelet"
w_class = ITEMSIZE_TINY
slot_flags = SLOT_TIE
slot = ACCESSORY_SLOT_DECOR
/obj/item/clothing/accessory/bracelet/friendship
name = "friendship bracelet"
desc = "A beautiful friendship bracelet in all the colors of the rainbow."
icon_state = "friendbracelet"
/obj/item/clothing/accessory/bracelet/friendship/verb/dedicate_bracelet()
set name = "Dedicate Bracelet"
set category = "Object"
set desc = "Dedicate your friendship bracelet to a special someone."
var/mob/M = usr
if(!M.mind)
return 0
var/input = sanitizeSafe(input(usr, "Who do you want to dedicate the bracelet to?", ,""), MAX_NAME_LEN)
if(src && input && !M.stat && in_range(M,src))
desc = "A beautiful friendship bracelet in all the colors of the rainbow. It's dedicated to [input]."
to_chat(M, "You dedicate the bracelet to [input], remembering the times you've had together.")
return 1
/obj/item/clothing/accessory/bracelet/material
icon_state = "materialbracelet"
/obj/item/clothing/accessory/bracelet/material/New(var/newloc, var/new_material)
..(newloc)
if(!new_material)
new_material = MAT_STEEL
material = get_material_by_name(new_material)
if(!istype(material))
qdel(src)
return
name = "[material.display_name] bracelet"
desc = "A bracelet made from [material.display_name]."
color = material.icon_colour
/obj/item/clothing/accessory/bracelet/material/get_material()
return material
/obj/item/clothing/accessory/bracelet/material/wood/New(var/newloc)
..(newloc, "wood")
/obj/item/clothing/accessory/bracelet/material/plastic/New(var/newloc)
..(newloc, "plastic")
/obj/item/clothing/accessory/bracelet/material/iron/New(var/newloc)
..(newloc, "iron")
/obj/item/clothing/accessory/bracelet/material/steel/New(var/newloc)
..(newloc, "steel")
/obj/item/clothing/accessory/bracelet/material/silver/New(var/newloc)
..(newloc, "silver")
/obj/item/clothing/accessory/bracelet/material/gold/New(var/newloc)
..(newloc, "gold")
/obj/item/clothing/accessory/bracelet/material/platinum/New(var/newloc)
..(newloc, "platinum")
/obj/item/clothing/accessory/bracelet/material/phoron/New(var/newloc)
..(newloc, "phoron")
/obj/item/clothing/accessory/bracelet/material/glass/New(var/newloc)
..(newloc, "glass")
..()
/obj/item/clothing/accessory/halfcape
name = "half cape"
desc = "A tasteful half-cape, suitible for European nobles and retro anime protagonists."
@@ -473,78 +405,6 @@
icon_state = "sash"
slot = ACCESSORY_SLOT_OVER
/obj/item/clothing/accessory/wristband
name = "wristband"
desc = "A simple plastic wristband."
icon = 'icons/inventory/accessory/item.dmi'
icon_state = "wristband"
w_class = ITEMSIZE_TINY
slot_flags = SLOT_TIE
slot = ACCESSORY_SLOT_DECOR
/obj/item/clothing/accessory/wristbandcollection
name = "wristband collection"
desc = "A mix of colourable plastic wristbands."
icon = 'icons/inventory/accessory/item.dmi'
icon_state = "wristband_collection"
w_class = ITEMSIZE_TINY
slot_flags = SLOT_TIE
slot = ACCESSORY_SLOT_DECOR
/obj/item/clothing/accessory/wristbandcollection/pink
name = "wristband collection"
desc = "A mix of colourable plastic wristbands."
icon = 'icons/inventory/accessory/item.dmi'
icon_state = "wristband_collection2"
w_class = ITEMSIZE_TINY
slot_flags = SLOT_TIE
slot = ACCESSORY_SLOT_DECOR
/obj/item/clothing/accessory/wristbandcollection/les
name = "wristband collection"
desc = "A mix of colourable plastic wristbands."
icon = 'icons/inventory/accessory/item.dmi'
icon_state = "wristband_collection3"
w_class = ITEMSIZE_TINY
slot_flags = SLOT_TIE
slot = ACCESSORY_SLOT_DECOR
/obj/item/clothing/accessory/wristbandcollection/trans
name = "wristband collection"
desc = "A mix of colourable plastic wristbands."
icon = 'icons/inventory/accessory/item.dmi'
icon_state = "wristband_collection4"
w_class = ITEMSIZE_TINY
slot_flags = SLOT_TIE
slot = ACCESSORY_SLOT_DECOR
/obj/item/clothing/accessory/wristbandcollection/bi
name = "wristband collection"
desc = "A mix of colourable plastic wristbands."
icon = 'icons/inventory/accessory/item.dmi'
icon_state = "wristband_collection5"
w_class = ITEMSIZE_TINY
slot_flags = SLOT_TIE
slot = ACCESSORY_SLOT_DECOR
/obj/item/clothing/accessory/wristbandcollection/ace
name = "wristband collection"
desc = "A mix of colourable plastic wristbands."
icon = 'icons/inventory/accessory/item.dmi'
icon_state = "wristband_collection6"
w_class = ITEMSIZE_TINY
slot_flags = SLOT_TIE
slot = ACCESSORY_SLOT_DECOR
/obj/item/clothing/accessory/wristband_spiked
name = "wristband (spiked)"
desc = "A black wristband with short spikes around it."
icon = 'icons/inventory/accessory/item.dmi'
icon_state = "wristband_spiked"
w_class = ITEMSIZE_TINY
slot_flags = SLOT_TIE
slot = ACCESSORY_SLOT_DECOR
//Gaiter scarves
/obj/item/clothing/accessory/gaiter
name = "red neck gaiter"
@@ -5,7 +5,7 @@
/obj/item/clothing/accessory/choker //A colorable, tagless choker
name = "plain choker"
slot_flags = SLOT_TIE | SLOT_OCLOTHING
desc = "A simple, plain choker. Or maybe it's a collar? Use in-hand to customize it."
desc = "A simple, plain choker. Or maybe it's a collar?"
icon = 'icons/inventory/accessory/item_vr.dmi'
icon_override = 'icons/inventory/accessory/mob_vr.dmi'
icon_state = "choker_cst"
@@ -44,18 +44,6 @@
/obj/item/clothing/accessory/choker/dropped()
icon_override = icon_previous_override
/obj/item/clothing/accessory/choker/attack_self(mob/user as mob)
if(!customized)
var/design = tgui_input_list(user,"Descriptor?","Pick descriptor","Descriptor", list("plain","simple","ornate","elegant","opulent"))
var/material = tgui_input_list(user,"Material?","Pick material","Material", list("leather","velvet","lace","fabric","latex","plastic","metal","chain","silver","gold","platinum","steel","bead","ruby","sapphire","emerald","diamond"))
var/type = tgui_input_list(user,"Type?","Pick type","Type", list("choker","collar","necklace"))
name = "[design] [material] [type]"
desc = "A [type], made of [material]. It's rather [design]."
customized = 1
to_chat(usr,span_notice("[src] has now been customized."))
else
to_chat(usr,span_notice("[src] has already been customized!"))
/obj/item/clothing/accessory/collar
slot_flags = SLOT_TIE | SLOT_OCLOTHING
icon = 'icons/inventory/accessory/item_vr.dmi'
+141
View File
@@ -0,0 +1,141 @@
/obj/item/clothing/accessory/knuckledusters
name = "knuckle dusters"
desc = "A pair of brass knuckles. Generally used to enhance the user's punches."
icon_state = "knuckledusters"
slot = ACCESSORY_SLOT_RING
slot_flags = SLOT_GLOVES
matter = list(MAT_STEEL = 500)
attack_verb = list("punched", "beaten", "struck")
siemens_coefficient = 1
force = 10 //base punch strength is 5
punch_force = 5 //added to base punch strength when added as a glove accessory
icon = 'icons/inventory/hands/item.dmi'
item_icons = list(
slot_l_hand_str = 'icons/mob/items/lefthand_gloves.dmi',
slot_r_hand_str = 'icons/mob/items/righthand_gloves.dmi',
)
drop_sound = 'sound/items/drop/metalboots.ogg'
pickup_sound = 'sound/items/pickup/toolbox.ogg'
//bracelets
/obj/item/clothing/accessory/bracelet
name = "bracelet"
desc = "A simple silver bracelet with a clasp."
icon = 'icons/inventory/accessory/item.dmi'
icon_state = "bracelet"
w_class = ITEMSIZE_TINY
slot_flags = SLOT_GLOVES
slot = ACCESSORY_SLOT_WRIST
/obj/item/clothing/accessory/bracelet/friendship
name = "friendship bracelet"
desc = "A beautiful friendship bracelet in all the colors of the rainbow."
icon_state = "friendbracelet"
/obj/item/clothing/accessory/bracelet/friendship/verb/dedicate_bracelet()
set name = "Dedicate Bracelet"
set category = "Object"
set desc = "Dedicate your friendship bracelet to a special someone."
var/mob/M = usr
if(!M.mind)
return 0
var/input = sanitizeSafe(input(usr, "Who do you want to dedicate the bracelet to?", ,""), MAX_NAME_LEN)
if(src && input && !M.stat && in_range(M,src))
desc = "A beautiful friendship bracelet in all the colors of the rainbow. It's dedicated to [input]."
to_chat(M, "You dedicate the bracelet to [input], remembering the times you've had together.")
return 1
/obj/item/clothing/accessory/bracelet/material
icon_state = "materialbracelet"
/obj/item/clothing/accessory/bracelet/material/New(var/newloc, var/new_material)
..(newloc)
if(!new_material)
new_material = MAT_STEEL
material = get_material_by_name(new_material)
if(!istype(material))
qdel(src)
return
name = "[material.display_name] bracelet"
desc = "A bracelet made from [material.display_name]."
color = material.icon_colour
/obj/item/clothing/accessory/bracelet/material/get_material()
return material
/obj/item/clothing/accessory/bracelet/material/wood/New(var/newloc)
..(newloc, "wood")
/obj/item/clothing/accessory/bracelet/material/plastic/New(var/newloc)
..(newloc, "plastic")
/obj/item/clothing/accessory/bracelet/material/iron/New(var/newloc)
..(newloc, "iron")
/obj/item/clothing/accessory/bracelet/material/steel/New(var/newloc)
..(newloc, "steel")
/obj/item/clothing/accessory/bracelet/material/silver/New(var/newloc)
..(newloc, "silver")
/obj/item/clothing/accessory/bracelet/material/gold/New(var/newloc)
..(newloc, "gold")
/obj/item/clothing/accessory/bracelet/material/platinum/New(var/newloc)
..(newloc, "platinum")
/obj/item/clothing/accessory/bracelet/material/phoron/New(var/newloc)
..(newloc, "phoron")
/obj/item/clothing/accessory/bracelet/material/glass/New(var/newloc)
..(newloc, "glass")
//wristbands
/obj/item/clothing/accessory/wristband
name = "wristband"
desc = "A simple plastic wristband."
icon = 'icons/inventory/accessory/item.dmi'
icon_state = "wristband"
w_class = ITEMSIZE_TINY
slot_flags = SLOT_GLOVES
slot = ACCESSORY_SLOT_WRIST
/obj/item/clothing/accessory/wristband/spiked
name = "wristband (spiked)"
desc = "A black wristband with short spikes around it."
icon_state = "wristband_spiked"
/obj/item/clothing/accessory/wristband/collection
name = "wristband collection"
desc = "A mix of colourable plastic wristbands."
icon_state = "wristband_collection"
/obj/item/clothing/accessory/wristband/collection/pink
name = "wristband collection"
desc = "A mix of colourable plastic wristbands."
icon_state = "wristband_collection2"
/obj/item/clothing/accessory/wristband/collection/les
name = "wristband collection"
desc = "A mix of colourable plastic wristbands."
icon_state = "wristband_collection3"
/obj/item/clothing/accessory/wristband/collection/trans
name = "wristband collection"
desc = "A mix of colourable plastic wristbands."
icon_state = "wristband_collection4"
/obj/item/clothing/accessory/wristband/collection/bi
name = "wristband collection"
desc = "A mix of colourable plastic wristbands."
icon_state = "wristband_collection5"
/obj/item/clothing/accessory/wristband/collection/ace
name = "wristband collection"
desc = "A mix of colourable plastic wristbands."
icon_state = "wristband_collection6"
+204
View File
@@ -0,0 +1,204 @@
//Generic Ring
/obj/item/clothing/accessory/ring
name = "generic ring"
desc = "Torus shaped finger decoration."
icon_state = "material"
drop_sound = 'sound/items/drop/ring.ogg'
slot = ACCESSORY_SLOT_RING
slot_flags = SLOT_GLOVES
item_icons = list(
slot_l_hand_str = 'icons/mob/items/lefthand_gloves.dmi',
slot_r_hand_str = 'icons/mob/items/righthand_gloves.dmi',
)
gender = PLURAL
w_class = ITEMSIZE_SMALL
icon = 'icons/inventory/hands/item.dmi'
drop_sound = 'sound/items/drop/ring.ogg'
pickup_sound = 'sound/items/pickup/ring.ogg'
force = 7 //base punch strength is 5
punch_force = 2 //added to base punch strength when added as a glove accessory
siemens_coefficient = 1
/////////////////////////////////////////
//Standard Rings
/obj/item/clothing/accessory/ring/engagement
name = "engagement ring"
desc = "An engagement ring. It certainly looks expensive."
icon_state = "diamond"
/obj/item/clothing/accessory/ring/engagement/attack_self(mob/user)
user.visible_message(span_warning("\The [user] gets down on one knee, presenting \the [src]."),span_warning("You get down on one knee, presenting \the [src]."))
/obj/item/clothing/accessory/ring/cti
name = "CTI ring"
desc = "A ring commemorating graduation from CTI."
icon_state = "cti-grad"
/obj/item/clothing/accessory/ring/mariner
name = "Mariner University ring"
desc = "A ring commemorating graduation from Mariner University."
icon_state = "mariner-grad"
/////////////////////////////////////////
//Reagent Rings
/obj/item/clothing/accessory/ring/reagent
flags = OPENCONTAINER
origin_tech = list(TECH_MATERIAL = 2, TECH_ILLEGAL = 4)
/obj/item/clothing/accessory/ring/reagent/Initialize()
. = ..()
create_reagents(15)
/obj/item/clothing/accessory/ring/reagent/equipped(var/mob/living/carbon/human/H)
..()
if(istype(H) && H.gloves==src)
if(reagents.total_volume)
to_chat(H, span_danger("You feel a prick as you slip on \the [src]."))
if(H.reagents)
var/contained = reagents.get_reagents()
var/trans = reagents.trans_to_mob(H, 15, CHEM_BLOOD)
add_attack_logs(usr, H, "Injected with [name] containing [contained] transferred [trans] units")
return
//Sleepy Ring
/obj/item/clothing/accessory/ring/reagent/sleepy
name = "silver ring"
desc = "A ring made from what appears to be silver."
icon_state = "material"
origin_tech = list(TECH_MATERIAL = 2, TECH_ILLEGAL = 5)
/obj/item/clothing/accessory/ring/reagent/sleepy/Initialize()
. = ..()
reagents.add_reagent("chloralhydrate", 15) // Less than a sleepy-pen, but still enough to knock someone out
/////////////////////////////////////////
//Seals and Signet Rings
/obj/item/clothing/accessory/ring/seal
var/stamptext = null
/obj/item/clothing/accessory/ring/seal/secgen
name = "Secretary-General's official seal"
desc = "The official seal of the Secretary-General of the Sol Central Government, featured prominently on a silver ring."
icon_state = "seal-secgen"
/obj/item/clothing/accessory/ring/seal/mason
name = "\improper Masonic ring"
desc = "The Square and Compasses feature prominently on this Masonic ring."
icon_state = "seal-masonic"
/obj/item/clothing/accessory/ring/seal/signet
name = "signet ring"
desc = "A signet ring, for when you're too sophisticated to sign letters."
icon_state = "seal-signet"
var/nameset = FALSE
/obj/item/clothing/accessory/ring/seal/signet/attack_self(mob/user)
if(nameset)
to_chat(user, span_notice("The [src] has already been claimed!"))
return
to_chat(user, span_notice("You claim the [src] as your own!"))
change_name(user)
nameset = TRUE
/obj/item/clothing/accessory/ring/seal/signet/proc/change_name(var/signet_name = "Unknown")
name = "[signet_name]'s signet ring"
desc = "A signet ring belonging to [signet_name], for when you're too sophisticated to sign letters."
/obj/item/clothing/accessory/ring/wedding
name = "golden wedding ring"
desc = "For showing your devotion to another person. It has a golden glimmer to it."
icon = 'icons/inventory/hands/item_vr.dmi'
icon_state = "wedring_g"
item_state = "wedring_g"
var/partnername = ""
/obj/item/clothing/accessory/ring/wedding/attack_self(mob/user)
partnername = copytext(sanitize(input(user, "Would you like to change the holoengraving on the ring?", "Name your spouse", "Bae") as null|text),1,MAX_NAME_LEN)
name = "[initial(name)] - [partnername]"
/obj/item/clothing/accessory/ring/wedding/silver
name = "silver wedding ring"
desc = "For showing your devotion to another person. It has a silver glimmer to it."
icon_state = "wedring_s"
item_state = "wedring_s"
/////////////////////////////////////////
//Material Rings
/obj/item/clothing/accessory/ring/material
icon = 'icons/inventory/hands/item.dmi'
icon_state = "material"
/obj/item/clothing/accessory/ring/material/New(var/newloc, var/new_material)
..(newloc)
if(!new_material)
new_material = MAT_STEEL
material = get_material_by_name(new_material)
if(!istype(material))
qdel(src)
return
name = "[material.display_name] ring"
desc = "A ring made from [material.display_name]."
color = material.icon_colour
/obj/item/clothing/accessory/ring/material/get_material()
return material
/obj/item/clothing/accessory/ring/material/wood/New(var/newloc)
..(newloc, MAT_WOOD)
/obj/item/clothing/accessory/ring/material/plastic/New(var/newloc)
..(newloc, MAT_PLASTIC)
/obj/item/clothing/accessory/ring/material/iron/New(var/newloc)
..(newloc, MAT_IRON)
/obj/item/clothing/accessory/ring/material/glass/New(var/newloc)
..(newloc, MAT_GLASS)
/obj/item/clothing/accessory/ring/material/steel/New(var/newloc)
..(newloc, MAT_STEEL)
/obj/item/clothing/accessory/ring/material/silver/New(var/newloc)
..(newloc, MAT_SILVER)
/obj/item/clothing/accessory/ring/material/gold/New(var/newloc)
..(newloc, MAT_GOLD)
/obj/item/clothing/accessory/ring/material/platinum/New(var/newloc)
..(newloc, MAT_PLATINUM)
/obj/item/clothing/accessory/ring/material/phoron/New(var/newloc)
..(newloc, MAT_PHORON)
/obj/item/clothing/accessory/ring/material/titanium/New(var/newloc)
..(newloc, MAT_TITANIUM)
/obj/item/clothing/accessory/ring/material/copper/New(var/newloc)
..(newloc, MAT_COPPER)
/obj/item/clothing/accessory/ring/material/bronze/New(var/newloc)
..(newloc, MAT_BRONZE)
/obj/item/clothing/accessory/ring/material/uranium/New(var/newloc)
..(newloc, MAT_URANIUM)
/obj/item/clothing/accessory/ring/material/osmium/New(var/newloc)
..(newloc, MAT_OSMIUM)
/obj/item/clothing/accessory/ring/material/lead/New(var/newloc)
..(newloc, MAT_LEAD)
/obj/item/clothing/accessory/ring/material/diamond/New(var/newloc)
..(newloc, MAT_DIAMOND)
/obj/item/clothing/accessory/ring/material/tin/New(var/newloc)
..(newloc, MAT_TIN)
/obj/item/clothing/accessory/ring/material/void_opal/New(var/newloc)
..(newloc, MAT_VOPAL)
@@ -0,0 +1,72 @@
/obj/item/clothing/accessory/watch
name = "wristwatch"
desc = "A cheap plastic quartz-based wristwatch. Painfully archaic by modern standards, but there's something charming about it all the same."
icon_state = "wristwatch_basic"
siemens_coefficient = 1
gender = "neuter"
slot = ACCESSORY_SLOT_WRIST
slot_flags = SLOT_GLOVES
icon = 'icons/inventory/hands/item.dmi'
item_icons = list(
slot_l_hand_str = 'icons/mob/items/lefthand_gloves.dmi',
slot_r_hand_str = 'icons/mob/items/righthand_gloves.dmi',
)
sprite_sheets = list(
SPECIES_TESHARI = 'icons/inventory/hands/mob_teshari.dmi',
SPECIES_VOX = 'icons/inventory/hands/mob_vox.dmi'
)
/obj/item/clothing/accessory/watch/examine(mob/user)
. = ..()
if(Adjacent(user))
. += span_notice("The current station time is [stationtime2text()].")
/obj/item/clothing/accessory/watch/silver
name = "silver wristwatch"
desc = "A humble silver (or maybe chrome) plated wristwatch. It's quite archaic, but nonetheless classy in its own way."
icon_state = "wristwatch_silver"
/obj/item/clothing/accessory/watch/gold
name = "gold wristwatch"
desc = "A very fancy gold-plated wristwatch. For when you want to casually show off just how wealthy you are. It even tells the time!"
icon_state = "wristwatch_gold"
/obj/item/clothing/accessory/watch/survival
name = "survival watch"
desc = "An overengineered wristwatch that purports to be both space and water proof, and includes a compass, micro GPS beacon, and temperature and pressure sensors. The beacon is off by default, and can only transmit its location: it cannot scan for other signals."
description_fluff = "Hold ALT whilst left-clicking on the survival watch to toggle the status of its micro-beacon."
icon_state = "wristwatch_survival"
var/obj/item/gps/gps = null
/obj/item/clothing/accessory/watch/survival/examine(mob/user)
. = ..()
if(Adjacent(user))
. += span_notice("You are currently facing [dir2text(user.dir)]. The micro beacon is [gps.tracking ? "on" : "off"].")
var/TB = user.loc
if(istype(TB, /turf/)) //no point returning light level if we're not on a turf (might be *in* someone!)
var/turf/TL = TB
var/light_level = TL.get_lumcount()
if(light_level)
. += span_notice("Light Level: [TL.get_lumcount()]")
else
. += span_notice("It's too dark to see the light level!")
if(istype(TB, /turf/simulated)) //no point returning atmospheric data from unsimulated tiles (they don't track pressure anyway, only temperature)
var/turf/simulated/T = TB
var/datum/gas_mixture/env = T.return_air()
. += span_notice("Pressure: [env.return_pressure()]kPa / Temperature: [env.temperature]K ")
/obj/item/clothing/accessory/watch/survival/New()
gps = new/obj/item/gps/watch(src)
/obj/item/gps/watch
gps_tag = "SRV-WTCH"
/obj/item/clothing/accessory/watch/survival/AltClick(mob/user)
. = ..()
if(Adjacent(user))
gps.tracking = !gps.tracking
to_chat(user,span_notice("You turn the micro beacon [gps.tracking ? "on" : "off"]."))
+7 -2
View File
@@ -326,6 +326,13 @@
drop_sound = 'sound/items/drop/gloves.ogg'
pickup_sound = 'sound/items/pickup/gloves.ogg'
valid_accessory_slots = (\
ACCESSORY_SLOT_RING\
|ACCESSORY_SLOT_WRIST)
restricted_accessory_slots = (\
ACCESSORY_SLOT_RING\
|ACCESSORY_SLOT_WRIST)
/obj/item/clothing/proc/set_clothing_index()
return
@@ -422,8 +429,6 @@
if(special_attack_type && ispath(special_attack_type))
special_attack = new special_attack_type
/////////////////////////////////////////////////////////////////////
//Rings
@@ -88,70 +88,3 @@
if(proximity && istype(usr, /mob/living/carbon/human) && do_after(usr, 1 SECOND, A))
return pickpocket(usr, A, proximity)
return 0
// Buzzer Ring - Traitor, Merc.
/obj/item/clothing/gloves/ring/buzzer
name = "ring"
desc = "A plain metal band."
description_antag = "This morphium-alloy ring continually generates an electric field, capable of electrocuting a target while not injuring the wearer.\
The device is also capable of 'frankenstein'-ing a corpse, long after normal technology would be able to save them. The body will still be tied to the\
normal damage limits for survival, however, so care must be taken."
icon_state = "material"
var/battery_type = /obj/item/cell/device/weapon/recharge
var/obj/item/cell/battery = null
/obj/item/clothing/gloves/ring/buzzer/get_cell()
return battery
/obj/item/clothing/gloves/ring/buzzer/Initialize()
. = ..()
if(!battery)
battery = new battery_type(src)
/obj/item/clothing/gloves/ring/buzzer/Touch(var/atom/A, var/proximity)
if(proximity && istype(usr, /mob/living/carbon/human))
return zap(usr, A, proximity)
return 0
/obj/item/clothing/gloves/ring/buzzer/proc/zap(var/mob/living/carbon/human/user, var/atom/movable/target, var/proximity)
. = FALSE
if(user.a_intent == I_HURT && battery.percent() >= 50)
if(isliving(target))
var/mob/living/L = target
if(ishuman(L) && battery.percent() >= 90) // Silent text-wise, for maximum potential for gimmicks.
var/mob/living/carbon/human/H = L
if(H.stat == DEAD)
. = TRUE
do_defib(H)
to_chat(L, span_warning("You feel a powerful shock!"))
if(!.)
playsound(L, 'sound/effects/sparks7.ogg', 40, 1)
L.electrocute_act(battery.percent() * 0.25, src)
battery.emp_act(2)
return .
return 0
/obj/item/clothing/gloves/ring/buzzer/proc/do_defib(var/mob/living/carbon/human/H = null)
if(!istype(H))
return 0
dead_mob_list.Remove(H)
if((H in living_mob_list) || (H in dead_mob_list))
WARNING("Mob [H] was ring-defibbed but already in the living or dead list still!")
living_mob_list += H
H.timeofdeath = 0
H.set_stat(UNCONSCIOUS)
H.failed_last_breath = 0
H.reload_fullscreen()
H.emote("gasp")
H.Weaken(rand(10,25))
H.updatehealth()
battery.emp_act(1)
@@ -121,21 +121,6 @@
heat_protection = HANDS
max_heat_protection_temperature = GLOVES_MAX_HEAT_PROTECTION_TEMPERATURE
/obj/item/clothing/gloves/knuckledusters
name = "knuckle dusters"
desc = "A pair of brass knuckles. Generally used to enhance the user's punches."
icon_state = "knuckledusters"
matter = list(MAT_STEEL = 500)
attack_verb = list("punched", "beaten", "struck")
flags = THICKMATERIAL // Stops rings from increasing hit strength
siemens_coefficient = 1
fingerprint_chance = 100
overgloves = 1
force = 5
punch_force = 5
drop_sound = 'sound/items/drop/metalboots.ogg'
pickup_sound = 'sound/items/pickup/toolbox.ogg'
/obj/item/clothing/gloves/ranger
var/glovecolor = "white"
name = "ranger gloves"
@@ -172,65 +157,3 @@
name = "water wings"
desc = "Swim aids designed to help a wearer float in water and learn to swim."
icon_state = "waterwings"
/obj/item/clothing/gloves/watch
name = "wristwatch"
desc = "A cheap plastic quartz-based wristwatch. Painfully archaic by modern standards, but there's something charming about it all the same."
icon_state = "wristwatch_basic"
siemens_coefficient = 1
gender = "neuter"
/obj/item/clothing/gloves/watch/examine(mob/user)
. = ..()
if(Adjacent(user))
. += span_notice("The current station time is [stationtime2text()].")
/obj/item/clothing/gloves/watch/silver
name = "silver wristwatch"
desc = "A humble silver (or maybe chrome) plated wristwatch. It's quite archaic, but nonetheless classy in its own way."
icon_state = "wristwatch_silver"
/obj/item/clothing/gloves/watch/gold
name = "gold wristwatch"
desc = "A very fancy gold-plated wristwatch. For when you want to casually show off just how wealthy you are. It even tells the time!"
icon_state = "wristwatch_gold"
/obj/item/clothing/gloves/watch/survival
name = "survival watch"
desc = "An overengineered wristwatch that purports to be both space and water proof, and includes a compass, micro GPS beacon, and temperature and pressure sensors. The beacon is off by default, and can only transmit its location: it cannot scan for other signals."
description_fluff = "Hold ALT whilst left-clicking on the survival watch to toggle the status of its micro-beacon."
icon_state = "wristwatch_survival"
var/obj/item/gps/gps = null
/obj/item/clothing/gloves/watch/survival/examine(mob/user)
. = ..()
if(Adjacent(user) && src.loc == user)
. += span_notice("You are currently facing [dir2text(user.dir)]. The micro beacon is [gps.tracking ? "on" : "off"].")
var/TB = src.loc.loc
if(istype(TB, /turf/)) //no point returning light level if we're not on a turf (might be *in* someone!)
var/turf/TL = TB
var/light_level = TL.get_lumcount()
if(light_level)
. += span_notice("Light Level: [TL.get_lumcount()]")
else
. += span_notice("It's too dark to see the light level!")
if(istype(TB, /turf/simulated)) //no point returning atmospheric data from unsimulated tiles (they don't track pressure anyway, only temperature)
var/turf/simulated/T = TB
var/datum/gas_mixture/env = T.return_air()
. += span_notice("Pressure: [env.return_pressure()]kPa / Temperature: [env.temperature]K ")
/obj/item/clothing/gloves/watch/survival/New()
gps = new/obj/item/gps/watch(src)
/obj/item/gps/watch
gps_tag = "SRV-WTCH"
/obj/item/clothing/gloves/watch/survival/AltClick(mob/user)
. = ..()
if(Adjacent(user))
gps.tracking = !gps.tracking
to_chat(user,span_notice("You turn the micro beacon [gps.tracking ? "on" : "off"]."))
-74
View File
@@ -1,74 +0,0 @@
/////////////////////////////////////////
//Material Rings
/obj/item/clothing/gloves/ring/material
icon = 'icons/inventory/hands/item.dmi'
icon_state = "material"
/obj/item/clothing/gloves/ring/material/New(var/newloc, var/new_material)
..(newloc)
if(!new_material)
new_material = MAT_STEEL
material = get_material_by_name(new_material)
if(!istype(material))
qdel(src)
return
name = "[material.display_name] ring"
desc = "A ring made from [material.display_name]."
color = material.icon_colour
/obj/item/clothing/gloves/ring/material/get_material()
return material
/obj/item/clothing/gloves/ring/material/wood/New(var/newloc)
..(newloc, MAT_WOOD)
/obj/item/clothing/gloves/ring/material/plastic/New(var/newloc)
..(newloc, MAT_PLASTIC)
/obj/item/clothing/gloves/ring/material/iron/New(var/newloc)
..(newloc, MAT_IRON)
/obj/item/clothing/gloves/ring/material/glass/New(var/newloc)
..(newloc, MAT_GLASS)
/obj/item/clothing/gloves/ring/material/steel/New(var/newloc)
..(newloc, MAT_STEEL)
/obj/item/clothing/gloves/ring/material/silver/New(var/newloc)
..(newloc, MAT_SILVER)
/obj/item/clothing/gloves/ring/material/gold/New(var/newloc)
..(newloc, MAT_GOLD)
/obj/item/clothing/gloves/ring/material/platinum/New(var/newloc)
..(newloc, MAT_PLATINUM)
/obj/item/clothing/gloves/ring/material/phoron/New(var/newloc)
..(newloc, MAT_PHORON)
/obj/item/clothing/gloves/ring/material/titanium/New(var/newloc)
..(newloc, MAT_TITANIUM)
/obj/item/clothing/gloves/ring/material/copper/New(var/newloc)
..(newloc, MAT_COPPER)
/obj/item/clothing/gloves/ring/material/bronze/New(var/newloc)
..(newloc, MAT_BRONZE)
/obj/item/clothing/gloves/ring/material/uranium/New(var/newloc)
..(newloc, MAT_URANIUM)
/obj/item/clothing/gloves/ring/material/osmium/New(var/newloc)
..(newloc, MAT_OSMIUM)
/obj/item/clothing/gloves/ring/material/lead/New(var/newloc)
..(newloc, MAT_LEAD)
/obj/item/clothing/gloves/ring/material/diamond/New(var/newloc)
..(newloc, MAT_DIAMOND)
/obj/item/clothing/gloves/ring/material/tin/New(var/newloc)
..(newloc, MAT_TIN)
/obj/item/clothing/gloves/ring/material/void_opal/New(var/newloc)
..(newloc, MAT_VOPAL)
-96
View File
@@ -1,96 +0,0 @@
//Generic Ring
/obj/item/clothing/gloves/ring
name = "generic ring"
desc = "Torus shaped finger decoration."
icon_state = "material"
drop_sound = 'sound/items/drop/ring.ogg'
/////////////////////////////////////////
//Standard Rings
/obj/item/clothing/gloves/ring/engagement
name = "engagement ring"
desc = "An engagement ring. It certainly looks expensive."
icon_state = "diamond"
/obj/item/clothing/gloves/ring/engagement/attack_self(mob/user)
user.visible_message(span_warning("\The [user] gets down on one knee, presenting \the [src]."),span_warning("You get down on one knee, presenting \the [src]."))
/obj/item/clothing/gloves/ring/cti
name = "CTI ring"
desc = "A ring commemorating graduation from CTI."
icon_state = "cti-grad"
/obj/item/clothing/gloves/ring/mariner
name = "Mariner University ring"
desc = "A ring commemorating graduation from Mariner University."
icon_state = "mariner-grad"
/////////////////////////////////////////
//Reagent Rings
/obj/item/clothing/gloves/ring/reagent
flags = OPENCONTAINER
origin_tech = list(TECH_MATERIAL = 2, TECH_ILLEGAL = 4)
/obj/item/clothing/gloves/ring/reagent/New()
..()
create_reagents(15)
/obj/item/clothing/gloves/ring/reagent/equipped(var/mob/living/carbon/human/H)
..()
if(istype(H) && H.gloves==src)
if(reagents.total_volume)
to_chat(H, span_danger("You feel a prick as you slip on \the [src]."))
if(H.reagents)
var/contained = reagents.get_reagents()
var/trans = reagents.trans_to_mob(H, 15, CHEM_BLOOD)
add_attack_logs(usr, H, "Injected with [name] containing [contained] transferred [trans] units")
return
//Sleepy Ring
/obj/item/clothing/gloves/ring/reagent/sleepy
name = "silver ring"
desc = "A ring made from what appears to be silver."
icon_state = "material"
origin_tech = list(TECH_MATERIAL = 2, TECH_ILLEGAL = 5)
/obj/item/clothing/gloves/ring/reagent/sleepy/New()
..()
reagents.add_reagent("chloralhydrate", 15) // Less than a sleepy-pen, but still enough to knock someone out
/////////////////////////////////////////
//Seals and Signet Rings
/obj/item/clothing/gloves/ring/seal
var/stamptext = null
/obj/item/clothing/gloves/ring/seal/secgen
name = "Secretary-General's official seal"
desc = "The official seal of the Secretary-General of the Sol Central Government, featured prominently on a silver ring."
icon_state = "seal-secgen"
/obj/item/clothing/gloves/ring/seal/mason
name = "\improper Masonic ring"
desc = "The Square and Compasses feature prominently on this Masonic ring."
icon_state = "seal-masonic"
/obj/item/clothing/gloves/ring/seal/signet
name = "signet ring"
desc = "A signet ring, for when you're too sophisticated to sign letters."
icon_state = "seal-signet"
var/nameset = FALSE
/obj/item/clothing/gloves/ring/seal/signet/attack_self(mob/user)
if(nameset)
to_chat(user, span_notice("The [src] has already been claimed!"))
return
to_chat(user, span_notice("You claim the [src] as your own!"))
change_name(user)
nameset = TRUE
/obj/item/clothing/gloves/ring/seal/signet/proc/change_name(var/signet_name = "Unknown")
name = "[signet_name]'s signet ring"
desc = "A signet ring belonging to [signet_name], for when you're too sophisticated to sign letters."
-17
View File
@@ -1,17 +0,0 @@
/obj/item/clothing/gloves/ring/wedding
name = "golden wedding ring"
desc = "For showing your devotion to another person. It has a golden glimmer to it."
icon = 'icons/inventory/hands/item_vr.dmi'
icon_state = "wedring_g"
item_state = "wedring_g"
var/partnername = ""
/obj/item/clothing/gloves/ring/wedding/attack_self(mob/user)
partnername = copytext(sanitize(input(user, "Would you like to change the holoengraving on the ring?", "Name your spouse", "Bae") as null|text),1,MAX_NAME_LEN)
name = "[initial(name)] - [partnername]"
/obj/item/clothing/gloves/ring/wedding/silver
name = "silver wedding ring"
desc = "For showing your devotion to another person. It has a silver glimmer to it."
icon_state = "wedring_s"
item_state = "wedring_s"
+32 -10
View File
@@ -415,7 +415,12 @@
/obj/item/stack/medical/advanced/ointment = 6,
/obj/item/stack/medical/splint = 4,
/obj/item/storage/pill_bottle/carbon = 2,
/obj/item/clothing/mask/chewable/candy/lolli = 15)
/obj/item/clothing/mask/chewable/candy/lolli = 15,
/obj/item/storage/box/khcrystal = 4,
/obj/item/backup_implanter = 3,
/obj/item/clothing/glasses/omnihud/med = 4,
/obj/item/glasses_kit = 1,
/obj/item/storage/quickdraw/syringe_case = 4)
contraband = list(/obj/item/reagent_containers/pill/tox = 3,
/obj/item/reagent_containers/pill/stox = 4,
/obj/item/reagent_containers/pill/antitox = 6)
@@ -448,7 +453,8 @@
products = list(/obj/item/stack/medical/bruise_pack = 2,
/obj/item/stack/medical/ointment = 2,
/obj/item/reagent_containers/hypospray/autoinjector = 4,
/obj/item/healthanalyzer = 1)
/obj/item/healthanalyzer = 1,
/obj/item/bodybag/cryobag = 2)
contraband = list(/obj/item/reagent_containers/syringe/antitoxin = 4,
/obj/item/reagent_containers/syringe/antiviral = 4,
/obj/item/reagent_containers/pill/tox = 1)
@@ -467,14 +473,19 @@
/obj/item/reagent_containers/syringe/antitoxin = 3,
/obj/item/stack/medical/bruise_pack = 3,
/obj/item/stack/medical/ointment =3,
/obj/item/healthanalyzer = 3)
/obj/item/healthanalyzer = 3,
/obj/item/bodybag/cryobag = 3)
contraband = list(/obj/item/reagent_containers/pill/tox = 3)
req_log_access = access_cmo
has_logs = 1
can_rotate = 0
/obj/machinery/vending/wallmed1/public
products = list(/obj/item/stack/medical/bruise_pack = 8,/obj/item/stack/medical/ointment = 8,/obj/item/reagent_containers/hypospray/autoinjector = 16,/obj/item/healthanalyzer = 4)
products = list(/obj/item/stack/medical/bruise_pack = 8,
/obj/item/stack/medical/ointment = 8,
/obj/item/reagent_containers/hypospray/autoinjector = 16,
/obj/item/healthanalyzer = 4,
/obj/item/bodybag/cryobag = 4)
/obj/machinery/vending/security
name = "SecTech"
@@ -488,9 +499,15 @@
/obj/item/flash = 5,
/obj/item/reagent_containers/food/snacks/donut/plain = 6,
/obj/item/reagent_containers/food/snacks/donut/plain/jelly = 6,
/obj/item/storage/box/evidence = 6)
/obj/item/storage/box/evidence = 6,
/obj/item/gun/energy/taser = 8,
/obj/item/gun/energy/stunrevolver = 4,
/obj/item/reagent_containers/spray/pepper = 6,
/obj/item/taperoll/police = 6,
/obj/item/clothing/glasses/omnihud/sec = 6)
contraband = list(/obj/item/clothing/glasses/sunglasses = 2,
/obj/item/storage/box/donut = 2)
/obj/item/storage/box/donut = 2,
/obj/item/implanter/compliance = 1)
req_log_access = access_armory
has_logs = 1
@@ -553,7 +570,9 @@
/obj/item/seeds/pumpkinseed = 3,
/obj/item/seeds/cherryseed = 3,
/obj/item/seeds/plastiseed = 3,
/obj/item/seeds/riceseed = 3)
/obj/item/seeds/riceseed = 3,
/obj/item/seeds/shrinkshroom = 3,
/obj/item/seeds/megashroom = 3)
contraband = list(/obj/item/seeds/amanitamycelium = 2,
/obj/item/seeds/glowshroom = 2,
/obj/item/seeds/libertymycelium = 2,
@@ -652,7 +671,8 @@
/obj/item/flashlight/glowstick/red = 3,
/obj/item/flashlight/glowstick/blue = 3,
/obj/item/flashlight/glowstick/orange =3,
/obj/item/flashlight/glowstick/yellow = 3)
/obj/item/flashlight/glowstick/yellow = 3,
/obj/item/reagent_containers/spray/windowsealant = 5)
contraband = list(/obj/item/weldingtool/hugetank = 2,
/obj/item/clothing/gloves/fyellow = 2)
premium = list(/obj/item/clothing/gloves/heavy_engineer = 1) //VOREStation Edit - yellow gloves are common in engineering, let's make "premium" actually mean something
@@ -695,8 +715,10 @@
/obj/item/circuitboard/body_scanner,
/obj/item/circuitboard/medical_kiosk,
/obj/item/circuitboard/sleeper,
/obj/item/circuitboard/dna_analyzer)
contraband = list(/obj/item/cell/potato = 3)
/obj/item/circuitboard/dna_analyzer,
/obj/item/clothing/glasses/omnihud/eng = 6)
contraband = list(/obj/item/cell/potato = 3,
/obj/item/rms = 5)
premium = list(/obj/item/storage/belt/utility = 3)
product_records = list()
req_log_access = access_ce
+42 -80
View File
@@ -1,41 +1,3 @@
//Tweaked existing vendors
/obj/machinery/vending/hydroseeds/Initialize()
. = ..()
products += list(/obj/item/seeds/shrinkshroom = 3,/obj/item/seeds/megashroom = 3)
/obj/machinery/vending/security/Initialize()
. = ..()
products += list(/obj/item/gun/energy/taser = 8,/obj/item/gun/energy/stunrevolver = 4,
/obj/item/reagent_containers/spray/pepper = 6,/obj/item/taperoll/police = 6,
/obj/item/clothing/glasses/omnihud/sec = 6)
contraband += list(/obj/item/implanter/compliance = 1)
/obj/machinery/vending/tool/Initialize()
. = ..()
products += list(/obj/item/reagent_containers/spray/windowsealant = 5)
/obj/machinery/vending/engivend/Initialize()
. = ..()
products += list(/obj/item/clothing/glasses/omnihud/eng = 6)
contraband += list(/obj/item/rms = 5)
/obj/machinery/vending/medical/Initialize()
. = ..()
products += list(/obj/item/storage/box/khcrystal = 4,/obj/item/backup_implanter = 3,
/obj/item/clothing/glasses/omnihud/med = 4, /obj/item/glasses_kit = 1, /obj/item/storage/quickdraw/syringe_case = 4)
/obj/machinery/vending/wallmed1/Initialize()
. = ..()
products += list(/obj/item/bodybag/cryobag = 2)
/obj/machinery/vending/wallmed2/Initialize()
. = ..()
products += list(/obj/item/bodybag/cryobag = 3)
/obj/machinery/vending/wallmed1/public/Initialize()
. = ..()
products += list(/obj/item/bodybag/cryobag = 4)
// Food Machines (for event/away maps)
//I want this not just as part of the zoo. ;v
@@ -519,7 +481,7 @@
/obj/item/clothing/under/color/yellow = 5,
/obj/item/clothing/shoes/black = 20,
/obj/item/clothing/shoes/white = 20,
/obj/item/clothing/gloves/watch = 20
/obj/item/clothing/accessory/watch = 20
)
prices = list()
@@ -614,13 +576,13 @@
/obj/item/clothing/accessory/wcoat/swvest/blue = 5,
/obj/item/clothing/accessory/wcoat/swvest/red = 5,
/obj/item/clothing/accessory/wristband = 5,
/obj/item/clothing/accessory/wristbandcollection = 5,
/obj/item/clothing/accessory/wristbandcollection/pink = 5,
/obj/item/clothing/accessory/wristbandcollection/les = 5,
/obj/item/clothing/accessory/wristbandcollection/bi = 5,
/obj/item/clothing/accessory/wristbandcollection/trans = 5,
/obj/item/clothing/accessory/wristbandcollection/ace = 5,
/obj/item/clothing/accessory/wristband_spiked = 5,
/obj/item/clothing/accessory/wristband/collection = 5,
/obj/item/clothing/accessory/wristband/collection/pink = 5,
/obj/item/clothing/accessory/wristband/collection/les = 5,
/obj/item/clothing/accessory/wristband/collection/bi = 5,
/obj/item/clothing/accessory/wristband/collection/trans = 5,
/obj/item/clothing/accessory/wristband/collection/ace = 5,
/obj/item/clothing/accessory/wristband/spiked = 5,
/obj/item/clothing/accessory/belt = 5,
/obj/item/clothing/accessory/belt/thick = 5,
/obj/item/clothing/accessory/belt/strap = 5,
@@ -636,13 +598,13 @@
/obj/item/clothing/ears/earmuffs/headphones = 5,
/obj/item/clothing/ears/earring/stud = 5,
/obj/item/clothing/ears/earring/dangle = 5,
/obj/item/clothing/gloves/ring/mariner = 5,
/obj/item/clothing/gloves/ring/engagement = 5,
/obj/item/clothing/gloves/ring/seal/signet = 5,
/obj/item/clothing/gloves/ring/seal/mason = 5,
/obj/item/clothing/gloves/ring/material/plastic = 5,
/obj/item/clothing/gloves/ring/material/steel = 5,
/obj/item/clothing/gloves/ring/material/gold = 5,
/obj/item/clothing/accessory/ring/mariner = 5,
/obj/item/clothing/accessory/ring/engagement = 5,
/obj/item/clothing/accessory/ring/seal/signet = 5,
/obj/item/clothing/accessory/ring/seal/mason = 5,
/obj/item/clothing/accessory/ring/material/plastic = 5,
/obj/item/clothing/accessory/ring/material/steel = 5,
/obj/item/clothing/accessory/ring/material/gold = 5,
/obj/item/clothing/glasses/eyepatch = 5,
/obj/item/clothing/glasses/gglasses = 5,
/obj/item/clothing/glasses/regular/hipster = 5,
@@ -670,9 +632,9 @@
/obj/item/clothing/accessory/pride/lesbian = 5,
/obj/item/clothing/accessory/pride/intersex = 5,
/obj/item/clothing/accessory/pride/vore = 5,
/obj/item/clothing/gloves/watch = 5,
/obj/item/clothing/gloves/watch/silver = 5,
/obj/item/clothing/gloves/watch/gold = 5
/obj/item/clothing/accessory/watch = 5,
/obj/item/clothing/accessory/watch/silver = 5,
/obj/item/clothing/accessory/watch/gold = 5
)
prices = list(/obj/item/clothing/accessory = 50,
/obj/item/clothing/accessory/armband/med/color = 50,
@@ -759,13 +721,13 @@
/obj/item/clothing/accessory/wcoat/swvest/blue = 50,
/obj/item/clothing/accessory/wcoat/swvest/red = 50,
/obj/item/clothing/accessory/wristband = 10,
/obj/item/clothing/accessory/wristbandcollection = 30,
/obj/item/clothing/accessory/wristbandcollection/pink = 30,
/obj/item/clothing/accessory/wristbandcollection/les = 30,
/obj/item/clothing/accessory/wristbandcollection/bi = 30,
/obj/item/clothing/accessory/wristbandcollection/trans = 30,
/obj/item/clothing/accessory/wristbandcollection/ace = 30,
/obj/item/clothing/accessory/wristband_spiked = 20,
/obj/item/clothing/accessory/wristband/collection = 30,
/obj/item/clothing/accessory/wristband/collection/pink = 30,
/obj/item/clothing/accessory/wristband/collection/les = 30,
/obj/item/clothing/accessory/wristband/collection/bi = 30,
/obj/item/clothing/accessory/wristband/collection/trans = 30,
/obj/item/clothing/accessory/wristband/collection/ace = 30,
/obj/item/clothing/accessory/wristband/spiked = 20,
/obj/item/clothing/accessory/belt = 50,
/obj/item/clothing/accessory/belt/thick = 50,
/obj/item/clothing/accessory/belt/strap = 50,
@@ -781,13 +743,13 @@
/obj/item/clothing/ears/earmuffs/headphones = 50,
/obj/item/clothing/ears/earring/stud = 50,
/obj/item/clothing/ears/earring/dangle = 50,
/obj/item/clothing/gloves/ring/mariner = 50,
/obj/item/clothing/gloves/ring/engagement = 50,
/obj/item/clothing/gloves/ring/seal/signet = 50,
/obj/item/clothing/gloves/ring/seal/mason = 50,
/obj/item/clothing/gloves/ring/material/plastic = 50,
/obj/item/clothing/gloves/ring/material/steel = 50,
/obj/item/clothing/gloves/ring/material/gold = 100,
/obj/item/clothing/accessory/ring/mariner = 50,
/obj/item/clothing/accessory/ring/engagement = 50,
/obj/item/clothing/accessory/ring/seal/signet = 50,
/obj/item/clothing/accessory/ring/seal/mason = 50,
/obj/item/clothing/accessory/ring/material/plastic = 50,
/obj/item/clothing/accessory/ring/material/steel = 50,
/obj/item/clothing/accessory/ring/material/gold = 100,
/obj/item/clothing/glasses/eyepatch = 50,
/obj/item/clothing/glasses/gglasses = 50,
/obj/item/clothing/glasses/regular/hipster = 50,
@@ -811,9 +773,9 @@
/obj/item/clothing/accessory/pride/lesbian = 50,
/obj/item/clothing/accessory/pride/intersex = 50,
/obj/item/clothing/accessory/pride/vore = 50,
/obj/item/clothing/gloves/watch = 50,
/obj/item/clothing/gloves/watch/silver = 100,
/obj/item/clothing/gloves/watch/gold = 200
/obj/item/clothing/accessory/watch = 50,
/obj/item/clothing/accessory/watch/silver = 100,
/obj/item/clothing/accessory/watch/gold = 200
)
premium = list(/obj/item/bedsheet/rainbow = 1)
contraband = list(/obj/item/clothing/mask/gas/clown_hat = 1,
@@ -2001,13 +1963,13 @@
/obj/item/clothing/ears/earmuffs/headphones = 5,
/obj/item/clothing/ears/earring/stud = 5,
/obj/item/clothing/ears/earring/dangle = 5,
/obj/item/clothing/gloves/ring/mariner = 5,
/obj/item/clothing/gloves/ring/engagement = 5,
/obj/item/clothing/gloves/ring/seal/signet = 5,
/obj/item/clothing/gloves/ring/seal/mason = 5,
/obj/item/clothing/gloves/ring/material/plastic = 5,
/obj/item/clothing/gloves/ring/material/steel = 5,
/obj/item/clothing/gloves/ring/material/gold = 5,
/obj/item/clothing/accessory/ring/mariner = 5,
/obj/item/clothing/accessory/ring/engagement = 5,
/obj/item/clothing/accessory/ring/seal/signet = 5,
/obj/item/clothing/accessory/ring/seal/mason = 5,
/obj/item/clothing/accessory/ring/material/plastic = 5,
/obj/item/clothing/accessory/ring/material/steel = 5,
/obj/item/clothing/accessory/ring/material/gold = 5,
/obj/item/clothing/glasses/eyepatch = 5,
/obj/item/clothing/glasses/gglasses = 5,
/obj/item/clothing/glasses/regular/hipster = 5,
+4 -5
View File
@@ -211,8 +211,8 @@
..()
/obj/item/deck/attack_self()
shuffle()
/obj/item/deck/attack_self(mob/user)
shuffle(user)
/obj/item/deck/verb/verb_shuffle()
@@ -220,10 +220,9 @@
set name = "Shuffle"
set desc = "Shuffle the cards in the deck."
set src in view(1)
shuffle()
shuffle(usr)
/obj/item/deck/proc/shuffle()
var/mob/living/user = usr
/obj/item/deck/proc/shuffle(mob/user)
if (cooldown < world.time - 10) // 15 ticks cooldown
var/list/newcards = list()
while(cards.len)
+55
View File
@@ -41,3 +41,58 @@
cooldown = world.time
else
return
///Fluff item, using a separate item rather than a subitem to customise New()
/obj/item/deck/dark_tarot
name = "dark rose tarot deck"
desc = "A limited edition tarot deck for the scene-girl inclined!"
icon_state = "dark_tarot"
/obj/item/deck/dark_tarot/New()
..()
var/datum/playingcard/P
for(var/name in list("fool","magician","high priestess","empress","emperor","hierophant","lovers","chariot","strength","hermit","wheel of fortune","justice","hanged man","death","temperance","devil","tower","star","moon","sun","judgement","world","white dragon with blue eyes","charred lizard","dark lotus","bash","reverse","rules","acid","abyss","maw"))
P = new()
P.name = "[name]"
if(name == "high priestess")
P.card_icon = "dark_high_priestess"
else if(name == "wheel of fortune")
P.card_icon = "dark_wheel"
else if(name == "hanged man")
P.card_icon = "dark_hanged"
else if(name == "white dragon with blue eyes")
P.card_icon = "dark_dragon"
else if(name == "charred lizard")
P.card_icon = "dark_lizard"
else if(name == "dark lotus")
P.card_icon = "dark_lotus"
else
P.card_icon = "dark_[name]"
P.back_icon = "dark_back_tarot"
cards += P
for(var/suit in list("wands","pentacles","cups","swords"))
for(var/number in list("ace","two","three","four","five","six","seven","eight","nine","ten","page","knight","queen","king"))
P = new()
P.name = "[number] of [suit]"
P.card_icon = "dark_[suit]"
P.back_icon = "dark_back_tarot"
cards += P
/obj/item/deck/dark_tarot/shuffle(mob/user)
if (cooldown < world.time - 10)
var/list/newcards = list()
while(cards.len)
var/datum/playingcard/P = pick(cards)
P.name = replacetext(P.name," reversed","")
if(prob(50))
P.name += " reversed"
newcards += P
cards -= P
cards = newcards
playsound(src, 'sound/items/cardshuffle.ogg', 50, 1)
user.visible_message("\The [user] shuffles [src].")
cooldown = world.time
else
return
@@ -361,7 +361,7 @@ var/list/name_to_material
new /datum/stack_recipe("[display_name] armor plate", /obj/item/material/armor_plating, 1, time = 20, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE),
new /datum/stack_recipe("[display_name] armor plate insert", /obj/item/material/armor_plating/insert, 2, time = 40, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE),
new /datum/stack_recipe("[display_name] grave marker", /obj/item/material/gravemarker, 5, time = 50, supplied_material = "[name]", pass_stack_color = TRUE),
new /datum/stack_recipe("[display_name] ring", /obj/item/clothing/gloves/ring/material, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE),
new /datum/stack_recipe("[display_name] ring", /obj/item/clothing/accessory/ring/material, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE),
new /datum/stack_recipe("[display_name] bracelet", /obj/item/clothing/accessory/bracelet/material, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
)
@@ -33,7 +33,7 @@
new /datum/stack_recipe("pouch, melee", /obj/item/storage/pouch/baton, 10, time = 20 SECONDS, pass_stack_color = FALSE, recycle_material = "[name]"), //vorestation Add
new /datum/stack_recipe("crude [display_name] bandage", /obj/item/stack/medical/crude_pack, 1, time = 2 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]"),
new /datum/stack_recipe("[display_name] net", /obj/item/material/fishing_net, 10, time = 5 SECONDS, supplied_material = "[name]", pass_stack_color = TRUE),
new /datum/stack_recipe("[display_name] ring", /obj/item/clothing/gloves/ring/material, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE),
new /datum/stack_recipe("[display_name] ring", /obj/item/clothing/accessory/ring/material, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE),
new /datum/stack_recipe("[display_name] bracelet", /obj/item/clothing/accessory/bracelet/material, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE),
new /datum/stack_recipe("[display_name] armor plate", /obj/item/material/armor_plating, 1, time = 20, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE),
new /datum/stack_recipe("empty sandbag", /obj/item/stack/emptysandbag, 2, time = 2 SECONDS, pass_stack_color = TRUE, supplied_material = "[name]"),
+1 -1
View File
@@ -223,7 +223,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
announce_ghost_joinleave(ghostize(1))
else
var/response
if(src.client && src.client.holder)
if(check_rights(R_ADMIN|R_SERVER|R_MOD,FALSE,src)) //No need to sanity check for client and holder here as that is part of check_rights
response = tgui_alert(src, "You have the ability to Admin-Ghost. The regular Ghost verb will announce your presence to dead chat. Both variants will allow you to return to your body using 'aghost'.\n\nWhat do you wish to do?", "Are you sure you want to ghost?", list("Admin Ghost", "Ghost", "Stay in body"))
if(response == "Admin Ghost")
if(!src.client)
@@ -22,7 +22,7 @@
var/to_wear_r_radio = null
var/to_wear_uniform = /obj/item/clothing/under/color/grey
var/to_wear_suit = /obj/item/clothing/suit/armor/material/makeshift/glass
var/to_wear_gloves = /obj/item/clothing/gloves/ring/material/platinum
var/to_wear_gloves = /obj/item/clothing/accessory/ring/material/platinum
var/to_wear_shoes = /obj/item/clothing/shoes/galoshes
var/to_wear_belt = /obj/item/storage/belt/utility/full
var/to_wear_l_pocket = /obj/item/soap
@@ -107,12 +107,10 @@
if(w_uniform && !(skip_gear & EXAMINE_SKIPJUMPSUIT) && w_uniform.show_examine)
//Ties
var/tie_msg
var/tie_msg_warn
if(istype(w_uniform,/obj/item/clothing/under) && !(skip_gear & EXAMINE_SKIPTIE))
var/obj/item/clothing/under/U = w_uniform
if(LAZYLEN(U.accessories))
tie_msg += ". Attached to it is"
tie_msg_warn += "! Attached to it is"
var/list/accessory_descs = list()
if(skip_gear & EXAMINE_SKIPHOLSTER)
for(var/obj/item/clothing/accessory/A in U.accessories)
@@ -139,12 +137,10 @@
//suit/armour
if(wear_suit)
var/tie_msg
var/tie_msg_warn
if(istype(wear_suit,/obj/item/clothing/suit))
var/obj/item/clothing/suit/U = wear_suit
if(LAZYLEN(U.accessories))
tie_msg += ". Attached to it is"
tie_msg_warn += "! Attached to it is"
var/list/accessory_descs = list()
for(var/accessory in U.accessories)
accessory_descs += "<a href='?src=\ref[src];lookitem_desc_only=\ref[accessory]'>\a [accessory]</a>"
@@ -185,10 +181,21 @@
//gloves
if(gloves && !(skip_gear & EXAMINE_SKIPGLOVES) && gloves.show_examine)
var/gloves_acc_msg
if(istype(gloves,/obj/item/clothing/gloves))
var/obj/item/clothing/gloves/G = gloves
if(LAZYLEN(G.accessories))
gloves_acc_msg += ". Attached to it is"
var/list/accessory_descs = list()
for(var/obj/item/clothing/accessory/A in G.accessories)
accessory_descs += "<a href='?src=\ref[src];lookitem_desc_only=\ref[A]'>\a [A]</a>"
gloves_acc_msg += " [lowertext(english_list(accessory_descs))]."
if(gloves.blood_DNA)
msg += span_warning("[T.He] [T.has] [icon2html(gloves,user.client)] [gloves.gender==PLURAL?"some":"a"] [(gloves.blood_color != "#030303") ? "blood" : "oil"]-stained <a href='?src=\ref[src];lookitem_desc_only=\ref[gloves]'>[gloves.name]</a> on [T.his] hands!")
msg += span_warning("[T.He] [T.has] [icon2html(gloves,user.client)] [gloves.gender==PLURAL?"some":"a"] [(gloves.blood_color != "#030303") ? "blood" : "oil"]-stained <a href='?src=\ref[src];lookitem_desc_only=\ref[gloves]'>[gloves.name]</a> on [T.his] hands![gloves_acc_msg]")
else
msg += "[T.He] [T.has] [icon2html(gloves,user.client)] <a href='?src=\ref[src];lookitem_desc_only=\ref[gloves]'>\a [gloves]</a> on [T.his] hands."
msg += "[T.He] [T.has] [icon2html(gloves,user.client)] <a href='?src=\ref[src];lookitem_desc_only=\ref[gloves]'>\a [gloves]</a> on [T.his] hands.[gloves_acc_msg]"
else if(blood_DNA && !(skip_body & EXAMINE_SKIPHANDS))
msg += span_warning("[T.He] [T.has] [(hand_blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained hands!")
@@ -272,8 +272,12 @@
var/obj/item/clothing/gloves/G = H.gloves
real_damage += G.punch_force
hit_dam_type = G.punch_damtype
if(H.pulling_punches && !attack.sharp && !attack.edge) //SO IT IS DECREED: PULLING PUNCHES WILL PREVENT THE ACTUAL DAMAGE FROM RINGS AND KNUCKLES, BUT NOT THE ADDED PAIN, BUT YOU CAN'T "PULL" A KNIFE
hit_dam_type = AGONY
else if(istype(H.gloves, /obj/item/clothing/accessory))
var/obj/item/clothing/accessory/G = H.gloves
real_damage += G.punch_force
hit_dam_type = G.punch_damtype
if(H.pulling_punches && !attack.sharp && !attack.edge) //SO IT IS DECREED: PULLING PUNCHES WILL PREVENT THE ACTUAL DAMAGE FROM RINGS AND KNUCKLES, BUT NOT THE ADDED PAIN, BUT YOU CAN'T "PULL" A KNIFE
hit_dam_type = AGONY
real_damage *= damage_multiplier
rand_damage *= damage_multiplier
if(HULK in H.mutations)
@@ -212,6 +212,9 @@
var/can_space_freemove = FALSE // Can we freely move in space?
var/can_zero_g_move = FALSE // What about just in zero-g non-space?
var/swim_mult = 1 //multiplier to our z-movement rate for swimming
var/climb_mult = 1 //multiplier to our z-movement rate for lattices/catwalks
var/item_slowdown_mod = 1 // How affected by item slowdown the species is.
var/primitive_form // Lesser form, if any (ie. monkey for humans)
var/greater_form // Greater form, if any, ie. human for monkeys.
@@ -242,6 +242,8 @@
reagent_tag = IS_TAJARA
allergens = ALLERGEN_STIMULANT
climb_mult = 0.75
move_trail = /obj/effect/decal/cleanable/blood/tracks/paw
heat_discomfort_level = 292
@@ -384,6 +384,8 @@
silk_reserve = 500
silk_max_reserve = 1000
climb_mult = 0.75
/datum/species/spider/handle_environment_special(var/mob/living/carbon/human/H)
if(H.stat == DEAD) // If they're dead they won't need anything.
return
@@ -110,6 +110,7 @@
water_breather = TRUE
water_movement = -4 //Negates shallow. Halves deep.
swim_mult = 0.5
flesh_color = "#AFA59E"
base_color = "#777777"
@@ -188,7 +188,9 @@
/datum/trait/negative/bad_swimmer
name = "Bad Swimmer"
desc = "You can't swim very well, all water slows you down a lot and you drown in deep water."
desc = "You can't swim very well, all water slows you down a lot and you drown in deep water. You also swim up and down 25% slower."
cost = -1
custom_only = FALSE
var_changes = list("bad_swimmer" = 1, "water_movement" = 4)
var_changes = list("bad_swimmer" = 1, "water_movement" = 4, "swim_mult" = 1.25)
varchange_type = TRAIT_VARCHANGE_LESS_BETTER
excludes = list(/datum/trait/positive/good_swimmer)
@@ -121,6 +121,7 @@
name = "Winged Flight"
desc = "Allows you to fly by using your wings. Don't forget to bring them!"
cost = 0
custom_only = FALSE
has_preferences = list("flight_vore" = list(TRAIT_PREF_TYPE_BOOLEAN, "Flight Vore enabled on spawn", TRAIT_VAREDIT_TARGET_MOB, FALSE))
/datum/trait/positive/winged_flight/apply(var/datum/species/S,var/mob/living/carbon/human/H)
@@ -241,12 +242,9 @@
cost = 1
var_changes = list("throwforce_absorb_threshold" = 10)
/datum/trait/positive/wall_climber
name = "Climber, Amateur"
desc = "You can climb certain walls without tools! This is likely a personal skill you developed."
desc = "You can climb certain walls without tools! This is likely a personal skill you developed. You can also climb lattices and ladders a little bit faster than everyone else."
tutorial = "You must approach a wall and right click it and select the \
'climb wall' verb to climb it. You suffer from a movement delay of 1.5 with this trait.\n \
Your total climb time is expected to be 17.5 seconds. Tools may reduce this. \n\n \
@@ -255,12 +253,12 @@
cost = 1
custom_only = FALSE
banned_species = list(SPECIES_TAJ, SPECIES_VASILISSAN) // They got unique climbing delay.
var_changes = list("can_climb" = TRUE)
var_changes = list("can_climb" = TRUE, "climb_mult" = 0.75)
excludes = list(/datum/trait/positive/wall_climber_pro, /datum/trait/positive/wall_climber_natural)
/datum/trait/positive/wall_climber_natural
name = "Climber, Natural"
desc = "You can climb certain walls without tools! This is likely due to the unique anatomy of your species. CUSTOM AND XENOCHIM ONLY"
desc = "You can climb certain walls without tools! This is likely due to the unique anatomy of your species. You can climb lattices and ladders slightly faster than everyone else. CUSTOM AND XENOCHIM ONLY"
tutorial = "You must approach a wall and right click it and select the \
'climb wall' verb to climb it. You suffer from a movement delay of 1.5 with this trait.\n \
Your total climb time is expected to be 17.5 seconds. Tools may reduce this. \n\n \
@@ -268,13 +266,13 @@
a climbable wall. To climbe like so, use the verb 'Climb Down Wall' in IC tab!"
cost = 0
custom_only = FALSE
var_changes = list("can_climb" = TRUE)
var_changes = list("can_climb" = TRUE, "climb_mult" = 0.75)
allowed_species = list(SPECIES_XENOCHIMERA, SPECIES_CUSTOM) //So that we avoid needless bloat for xenochim
excludes = list(/datum/trait/positive/wall_climber_pro, /datum/trait/positive/wall_climber)
/datum/trait/positive/wall_climber_pro
name = "Climber, Professional"
desc = "You can climb certain walls without tools! You are a professional rock climber at this, letting you climb almost twice as fast!"
desc = "You can climb certain walls without tools! You are a professional rock climber at this, letting you climb almost twice as fast! You can also climb lattices and ladders a fair bit faster than everyone else!"
tutorial = "You must approach a wall and right click it and select the \
'climb wall' verb to climb it. Your movement delay is just 1.25 with this trait.\n \
Your climb time is expected to be 9 seconds. Tools may reduce this. \n\n \
@@ -282,7 +280,7 @@
a climbable wall. To climbe like so, use the verb 'Climb Down Wall' in IC tab!"
cost = 2
custom_only = FALSE
var_changes = list("climbing_delay" = 1.25)
var_changes = list("climbing_delay" = 1.25, "climb_mult" = 0.5)
varchange_type = TRAIT_VARCHANGE_LESS_BETTER
excludes = list(/datum/trait/positive/wall_climber,/datum/trait/positive/wall_climber_natural)
@@ -292,3 +290,14 @@
/datum/trait/positive/wall_climber_pro/apply(var/datum/species/S,var/mob/living/carbon/human/H)
..()
S.can_climb = TRUE
/datum/trait/positive/good_swimmer
name = "Pro Swimmer"
desc = "You were top of your group in swimming class! This is of questionable usefulness on most planets, but hey, maybe you'll get to visit a nice beach world someday?"
tutorial = "You move faster in water, and can move up and down z-levels faster than other swimmers!"
cost = 1
custom_only = FALSE
var_changes = list("water_movement" = -2, "swim_mult" = 0.5)
varchange_type = TRAIT_VARCHANGE_LESS_BETTER
excludes = list(/datum/trait/negative/bad_swimmer)
banned_species = list(SPECIES_AKULA) // They already swim better than this
@@ -203,9 +203,6 @@ var/list/mob_hat_cache = list()
can_pick_shell = FALSE
update_icon()
/mob/living/silicon/robot/drone/choose_icon()
return
/mob/living/silicon/robot/drone/pick_module()
return
@@ -11,11 +11,6 @@
repick_laws()
// Forces synths to select an icon relevant to their module
if(!icon_selected)
icon_selection_tries = SSrobot_sprites.get_module_sprites_len(modtype, src) + 1
choose_icon(icon_selection_tries)
if(sprite_datum && module)
sprite_datum.do_equipment_glamour(module)
pick_module()
plane_holder.set_vis(VIS_AUGMENTED, TRUE)
+23 -104
View File
@@ -31,8 +31,7 @@
//Icon stuff
var/datum/robot_sprite/sprite_datum // Sprite datum, holding all our sprite data
var/icon_selected = 1 // If icon selection has been completed yet
var/icon_selection_tries = 0 // Remaining attempts to select icon before a selection is forced
var/icon_selected = FALSE // If icon selection has been completed yet
var/list/sprite_extra_customization = list()
var/rest_style = "Default"
var/notransform
@@ -47,6 +46,9 @@
var/shown_robot_modules = 0 //Used to determine whether they have the module menu shown or not
var/obj/screen/robot_modules_background
var/ui_theme
var/selecting_module = FALSE
//3 Modules can be activated at any one time.
var/obj/item/robot_module/module = null
var/module_active = null
@@ -336,46 +338,17 @@
return module_sprites
*/
/mob/living/silicon/robot/proc/pick_module()
if(icon_selected)
return
if(module)
return
var/list/modules = list()
//VOREStatation Edit Start: shell restrictions
if(shell)
if(restrict_modules_to.len > 0)
modules.Add(restrict_modules_to)
else
modules.Add(shell_module_types)
else
if(restrict_modules_to.len > 0)
modules.Add(restrict_modules_to)
else
modules.Add(robot_module_types)
if(crisis || security_level == SEC_LEVEL_RED || crisis_override)
to_chat(src, span_red("Crisis mode active. Combat module available."))
modules |= emergency_module_types
for(var/module_name in whitelisted_module_types)
if(is_borg_whitelisted(src, module_name))
modules |= module_name
//VOREStatation Edit End: shell restrictions
modtype = tgui_input_list(usr, "Please, select a module!", "Robot module", modules)
if(module)
return
if(!(modtype in robot_modules))
return
if(!is_borg_whitelisted(src, modtype))
return
var/module_type = robot_modules[modtype]
transform_with_anim() //VOREStation edit: sprite animation
new module_type(src)
hands.icon_state = get_hud_module_icon()
feedback_inc("cyborg_[lowertext(modtype)]",1)
updatename()
hud_used.update_robot_modules_display()
notify_ai(ROBOT_NOTIFICATION_NEW_MODULE, module.name)
robotact?.update_static_data_for_all_viewers()
var/list/module_sprites = SSrobot_sprites.get_module_sprites(module, src)
if(module_sprites.len == 1 || !client)
sprite_datum = module_sprites[1]
sprite_datum.do_equipment_glamour(module)
return
if(!selecting_module)
var/datum/tgui_module/robot_ui_module/ui = new(src)
ui.tgui_interact(src)
/mob/living/silicon/robot/proc/update_braintype()
if(istype(mmi, /obj/item/mmi/digital/posibrain))
@@ -436,15 +409,12 @@
to_chat(usr, "You can't pick another custom name. [isshell(src) ? "" : "Go ask for a name change."]")
return 0
spawn(0)
var/newname
newname = sanitizeSafe(tgui_input_text(src,"You are a robot. Enter a name, or leave blank for the default name.", "Name change","", MAX_NAME_LEN), MAX_NAME_LEN)
if (newname)
custom_name = newname
sprite_name = newname
var/newname = sanitizeSafe(tgui_input_text(src,"You are a robot. Enter a name, or leave blank for the default name.", "Name change","", MAX_NAME_LEN), MAX_NAME_LEN)
if (newname)
custom_name = newname
sprite_name = newname
updatename()
update_icon()
updatename()
/mob/living/silicon/robot/verb/extra_customization()
set name = "Customize Appearance"
@@ -744,6 +714,8 @@
to_chat(usr, span_filter_notice("You must access the borgs internals!"))
else if(!src.module && U.require_module)
to_chat(usr, span_filter_notice("The borg must choose a module before it can be upgraded!"))
else if(user == src && istype(W,/obj/item/borg/upgrade/utility/reset))
to_chat(usr, span_warning("You are restricted from reseting your own module."))
else if(U.locked)
to_chat(usr, span_filter_notice("The upgrade is locked and cannot be used yet!"))
else
@@ -796,6 +768,7 @@
notify_ai(ROBOT_NOTIFICATION_MODULE_RESET, module.name)
module.Reset(src)
qdel(module)
icon_selected = FALSE
module = null
updatename("Default")
has_recoloured = FALSE
@@ -903,7 +876,7 @@
else if(istype(M, /mob/living/silicon/robot))
var/mob/living/silicon/robot/R = M
if(check_access(R.get_active_hand()) || istype(R.get_active_hand(), /obj/item/card/robot))
return 1
return TRUE
return 0
/mob/living/silicon/robot/proc/check_access(obj/item/I)
@@ -1088,60 +1061,6 @@
return
/mob/living/silicon/robot/proc/choose_icon(var/triesleft)
var/robot_species = null
if(!SSrobot_sprites)
to_chat(src, "Robot Sprites have not been initialized yet. How are you choosing a sprite? Harass a coder.")
return
var/list/module_sprites = SSrobot_sprites.get_module_sprites(modtype, src)
if(!module_sprites || !module_sprites.len)
to_chat(src, "Your module appears to have no sprite options. Harass a coder.")
return
icon_selected = 0
icon_selection_tries = triesleft
if(module_sprites.len == 1 || !client)
if(!(sprite_datum in module_sprites))
sprite_datum = module_sprites[1]
else
var/selection = tgui_input_list(src, "Select an icon! [triesleft ? "You have [triesleft] more chance\s." : "This is your last try."]", "Robot Icon", module_sprites)
if(selection)
sprite_datum = selection
else
sprite_datum = module_sprites[1]
if(!istype(src,/mob/living/silicon/robot/drone))
robot_species = sprite_datum.name
if(notransform)
to_chat(src, "Your current transformation has not finished yet!")
choose_icon(icon_selection_tries)
return
else
transform_with_anim()
var/tempheight = vis_height
update_icon()
// This is bad but I dunno other way to 'reset' our resize offset based on vis_height changes other than resizing to normal and back.
if(tempheight != vis_height)
var/tempsize = size_multiplier
resize(1)
resize(tempsize)
if (module_sprites.len > 1 && triesleft >= 1 && client)
icon_selection_tries--
var/choice = tgui_alert(usr, "Look at your icon - is this what you want?", "Icon Choice", list("Yes","No"))
if(choice == "No")
choose_icon(icon_selection_tries)
return
icon_selected = 1
icon_selection_tries = 0
sprite_type = robot_species
if(hands)
update_hud()
to_chat(src, span_filter_notice("Your icon has been set. You now require a module reset to change it."))
/mob/living/silicon/robot/proc/set_default_module_icon()
if(!SSrobot_sprites)
return
@@ -73,7 +73,7 @@ var/global/list/robot_modules = list(
R.radio.recalculateChannels()
R.set_default_module_icon()
R.choose_icon(SSrobot_sprites.get_module_sprites_len(R.modtype, R) + 1)
R.pick_module()
if(!R.client)
R.icon_selected = FALSE // It wasnt a player selecting icon? Let them do it later!
@@ -93,7 +93,7 @@ var/global/list/robot_modules = list(
if(R.radio)
R.radio.recalculateChannels()
R.choose_icon(0)
R.set_default_module_icon()
R.scrubbing = FALSE
@@ -52,6 +52,10 @@
var/mob/living/silicon/robot/R = host
data["module_name"] = R.module ? "[R.module]" : null
if(R.emagged)
data["theme"] = "syndicate"
else if (R.ui_theme)
data["theme"] = R.ui_theme
if(!R.module)
return data

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