mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-18 18:44:48 +01:00
Merge remote-tracking branch 'upstream/master'
This commit is contained in:
@@ -36,6 +36,7 @@
|
||||
var/siemens_coefficient = 1 // for electrical admittance/conductance (electrocution checks and shit)
|
||||
var/slowdown = 0 // How much clothing is slowing you down. Negative values speeds you up
|
||||
var/canremove = 1 //Mostly for Ninja code at this point but basically will not allow the item to be removed if set to 0. /N
|
||||
var/reflect_chance = 0 //This var dictates what % of a time an object will reflect an energy based weapon's shot
|
||||
var/armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
var/list/allowed = null //suit storage stuff.
|
||||
var/obj/item/device/uplink/hidden/hidden_uplink = null // All items can have an uplink hidden inside, just remember to add the triggers.
|
||||
@@ -557,6 +558,10 @@
|
||||
/obj/item/proc/IsShield()
|
||||
return 0
|
||||
|
||||
/obj/item/proc/IsReflect(var/def_zone) //This proc determines if and at what% an object will reflect energy projectiles if it's in l_hand,r_hand or wear_suit
|
||||
if(prob(reflect_chance))
|
||||
return 1
|
||||
|
||||
/obj/item/proc/get_loc_turf()
|
||||
var/atom/L = loc
|
||||
while(L && !istype(L, /turf/))
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
// Bluespace crystals, used in telescience and when crushed it will blink you to a random turf.
|
||||
/obj/item/bluespace_crystal
|
||||
name = "bluespace crystal"
|
||||
desc = "A glowing bluespace crystal, not much is known about how they work. It looks very delicate."
|
||||
icon = 'icons/obj/telescience.dmi'
|
||||
icon_state = "bluespace_crystal"
|
||||
w_class = 1
|
||||
origin_tech = "bluespace=4;materials=5"
|
||||
var/blink_range = 8 // The teleport range when crushed/thrown at someone.
|
||||
|
||||
/obj/item/bluespace_crystal/New()
|
||||
..()
|
||||
pixel_x = rand(-5, 5)
|
||||
pixel_y = rand(-5, 5)
|
||||
|
||||
/obj/item/bluespace_crystal/attack_self(var/mob/user)
|
||||
blink_mob(user)
|
||||
user.drop_item()
|
||||
user.visible_message("<span class='notice'>[user] crushes the [src]!</span>")
|
||||
qdel(src)
|
||||
|
||||
/obj/item/bluespace_crystal/proc/blink_mob(var/mob/living/L)
|
||||
do_teleport(L, get_turf(L), blink_range, asoundin = 'sound/effects/phasein.ogg')
|
||||
|
||||
/obj/item/bluespace_crystal/throw_impact(atom/hit_atom)
|
||||
..()
|
||||
if(isliving(hit_atom))
|
||||
blink_mob(hit_atom)
|
||||
qdel(src)
|
||||
|
||||
// Artifical bluespace crystal, doesn't give you much research.
|
||||
/obj/item/bluespace_crystal/artificial
|
||||
name = "artificial bluespace crystal"
|
||||
desc = "An artificially made bluespace crystal, it looks delicate."
|
||||
origin_tech = "bluespace=2"
|
||||
blink_range = 4 // Not as good as the organic stuff!
|
||||
@@ -1,19 +1,26 @@
|
||||
var/list/sps_list = list()
|
||||
/obj/item/device/sps
|
||||
name = "Space Positioning System"
|
||||
desc = "Helping lost spacemen find their way through the galaxy since 3016."
|
||||
name = "space positioning system"
|
||||
desc = "Helping lost spacemen find their way through the planets since 2016."
|
||||
icon = 'icons/obj/telescience.dmi'
|
||||
icon_state = "gps-c"
|
||||
w_class = 2.0
|
||||
flags = FPRINT
|
||||
slot_flags = SLOT_BELT
|
||||
origin_tech = "programming=2;engineering=2"
|
||||
var/gpstag = "COM0"
|
||||
origin_tech = "materials=2;magnets=3;bluespace=2"
|
||||
var/spstag = "COM0"
|
||||
var/emped = 0
|
||||
var/turf/locked_location
|
||||
|
||||
/obj/item/device/sps/New()
|
||||
name = "Space Positioning System ([gpstag])"
|
||||
..()
|
||||
sps_list.Add(src)
|
||||
name = "space positioning system ([spstag])"
|
||||
overlays += "working"
|
||||
|
||||
/obj/item/device/sps/Destroy()
|
||||
sps_list.Remove(src)
|
||||
..()
|
||||
|
||||
/obj/item/device/sps/emp_act(severity)
|
||||
emped = 1
|
||||
overlays -= "working"
|
||||
@@ -24,43 +31,54 @@
|
||||
overlays += "working"
|
||||
|
||||
/obj/item/device/sps/attack_self(mob/user as mob)
|
||||
|
||||
var/obj/item/device/sps/t = ""
|
||||
var/sps_window_height = 110 + sps_list.len * 20 // Variable window height, depending on how many sps units there are to show
|
||||
if(emped)
|
||||
t += "ERROR"
|
||||
else
|
||||
t += "<BR><A href='?src=\ref[src];tag=1'>Set Tag</A> "
|
||||
t += "<BR>Tag: [gpstag]"
|
||||
t += "<A href='?src=\ref[src];tag=1'>Set Tag</A><A href='?src=\ref[src];refresh=1'>Refresh</A>"
|
||||
t += "<BR>Tag: [spstag]"
|
||||
if(locked_location && locked_location.loc)
|
||||
t += "<BR>Bluespace coordinates saved: [locked_location.loc]"
|
||||
sps_window_height += 20
|
||||
|
||||
for(var/obj/item/device/sps/G in world)
|
||||
for(var/obj/item/device/sps/G in sps_list)
|
||||
var/turf/pos = get_turf(G)
|
||||
var/area/gps_area = get_area(G)
|
||||
var/tracked_gpstag = G.gpstag
|
||||
var/area/sps_area = get_area(G)
|
||||
var/tracked_spstag = G.spstag
|
||||
if(G.emped == 1)
|
||||
t += "<BR>[tracked_gpstag]: ERROR"
|
||||
t += "<BR>[tracked_spstag]: ERROR"
|
||||
else
|
||||
t += "<BR>[tracked_gpstag]: [format_text(gps_area.name)] ([pos.x], [pos.y], [pos.z])"
|
||||
t += "<BR>[tracked_spstag]: [format_text(sps_area.name)] ([pos.x], [pos.y], [pos.z])"
|
||||
|
||||
var/datum/browser/popup = new(user, "SPS", name, 600, 450)
|
||||
var/datum/browser/popup = new(user, "sps", name, 360, min(sps_window_height, 800))
|
||||
popup.set_content(t)
|
||||
popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
|
||||
popup.open()
|
||||
|
||||
/obj/item/device/sps/Topic(href, href_list)
|
||||
..()
|
||||
if(href_list["tag"] )
|
||||
var/a = input("Please enter desired tag.", name, gpstag) as text
|
||||
a = copytext(sanitize(a), 1, 20)
|
||||
if(length(a) != 4)
|
||||
usr << "\blue The tag must be four letters long!"
|
||||
return
|
||||
else
|
||||
gpstag = a
|
||||
name = "Space Positioning System ([gpstag])"
|
||||
return
|
||||
var/a = input("Please enter desired tag.", name, spstag) as text
|
||||
a = uppertext(copytext(sanitize(a), 1, 5))
|
||||
if(src.loc == usr)
|
||||
spstag = a
|
||||
name = "space positioning system ([spstag])"
|
||||
attack_self(usr)
|
||||
if(href_list["refresh"] )
|
||||
if(src.loc == usr)
|
||||
attack_self(usr)
|
||||
|
||||
/obj/item/device/sps/science
|
||||
icon_state = "gps-s"
|
||||
gpstag = "SCI0"
|
||||
spstag = "SCI0"
|
||||
|
||||
/obj/item/device/sps/engineering
|
||||
icon_state = "gps-e"
|
||||
gpstag = "ENG0"
|
||||
spstag = "ENG0"
|
||||
|
||||
/obj/item/device/sps/mining
|
||||
icon_state = "gps-m"
|
||||
spstag = "MINE0"
|
||||
desc = "A positioning system helpful for rescuing trapped or injured miners, keeping one on you at all times while mining might just save your life."
|
||||
|
||||
@@ -30,10 +30,13 @@
|
||||
return (BRUTELOSS|FIRELOSS)
|
||||
|
||||
/obj/item/weapon/melee/energy/sword
|
||||
var/hacked = 0
|
||||
var/blade_color
|
||||
color
|
||||
name = "energy sword"
|
||||
desc = "May the force be within you."
|
||||
icon_state = "sword0"
|
||||
icon_override = 'icons/mob/in-hand/swords.dmi'
|
||||
force = 3.0
|
||||
throwforce = 5.0
|
||||
throw_speed = 1
|
||||
|
||||
@@ -20,8 +20,8 @@
|
||||
create_reagents(mopcap)
|
||||
|
||||
|
||||
obj/item/weapon/mop/proc/clean(turf/simulated/A)
|
||||
if(reagents.has_reagent("water", 1) || reagents.has_reagent("holywater", 1))
|
||||
/obj/item/weapon/mop/proc/clean(turf/simulated/A)
|
||||
if(reagents.has_reagent("water", 1) || reagents.has_reagent("cleaner", 1) || reagents.has_reagent("holywater", 1))
|
||||
A.clean_blood()
|
||||
for(var/obj/effect/O in A)
|
||||
if(istype(O,/obj/effect/decal/cleanable) || istype(O,/obj/effect/overlay) || istype(O,/obj/effect/rune))
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
w_class = 3.0
|
||||
var/charge = 0 // note %age conveted to actual charge in New
|
||||
var/maxcharge = 10000
|
||||
var/rating = 1
|
||||
m_amt = 700
|
||||
g_amt = 50
|
||||
var/rigged = 0 // true if rigged to explode
|
||||
@@ -29,6 +30,7 @@
|
||||
desc = "You can't top the plasma top." //TOTALLY TRADEMARK INFRINGEMENT
|
||||
origin_tech = "powerstorage=0"
|
||||
maxcharge = 5000
|
||||
rating = 2
|
||||
g_amt = 40
|
||||
|
||||
/obj/item/weapon/cell/crap/empty/New()
|
||||
@@ -39,6 +41,7 @@
|
||||
name = "\improper Security borg rechargable D battery"
|
||||
origin_tech = "powerstorage=0"
|
||||
maxcharge = 6000 //6000 max charge / 1000 charge per shot = six shots
|
||||
rating = 2.5
|
||||
g_amt = 40
|
||||
|
||||
/obj/item/weapon/cell/secborg/empty/New()
|
||||
@@ -50,6 +53,7 @@
|
||||
origin_tech = "powerstorage=2"
|
||||
icon_state = "hcell"
|
||||
maxcharge = 15000
|
||||
rating = 3
|
||||
g_amt = 60
|
||||
|
||||
/obj/item/weapon/cell/high/empty/New()
|
||||
@@ -62,6 +66,7 @@
|
||||
icon_state = "scell"
|
||||
maxcharge = 20000
|
||||
g_amt = 70
|
||||
rating = 4
|
||||
construction_cost = list("metal"=750,"glass"=100)
|
||||
|
||||
/obj/item/weapon/cell/super/empty/New()
|
||||
@@ -73,6 +78,7 @@
|
||||
origin_tech = "powerstorage=6"
|
||||
icon_state = "hpcell"
|
||||
maxcharge = 30000
|
||||
rating = 5
|
||||
g_amt = 80
|
||||
construction_cost = list("metal"=500,"glass"=150,"gold"=200,"silver"=200)
|
||||
|
||||
@@ -85,6 +91,7 @@
|
||||
icon_state = "icell"
|
||||
origin_tech = null
|
||||
maxcharge = 30000
|
||||
rating = 6
|
||||
g_amt = 80
|
||||
use()
|
||||
return 1
|
||||
@@ -97,6 +104,7 @@
|
||||
icon_state = "potato_cell" //"potato_battery"
|
||||
charge = 100
|
||||
maxcharge = 3000
|
||||
rating = 1
|
||||
m_amt = 0
|
||||
g_amt = 0
|
||||
minor_fault = 1
|
||||
@@ -109,6 +117,6 @@
|
||||
icon = 'icons/mob/slimes.dmi' //'icons/obj/harvest.dmi'
|
||||
icon_state = "yellow slime extract" //"potato_battery"
|
||||
maxcharge = 10000
|
||||
maxcharge = 10000
|
||||
rating = 3
|
||||
m_amt = 0
|
||||
g_amt = 0
|
||||
|
||||
@@ -203,6 +203,17 @@
|
||||
item_state = "Dpacket"
|
||||
|
||||
|
||||
/obj/item/weapon/storage/fancy/cigarettes/syndicate
|
||||
name = "\improper Syndicate Cigarettes"
|
||||
desc = "A packet of six evil-looking cigarettes, A label on the packaging reads, \"Donk Co\""
|
||||
icon_state = "robustpacket"
|
||||
item_state = "robustpacket"
|
||||
|
||||
/obj/item/weapon/storage/fancy/cigarettes/syndicate/New()
|
||||
..()
|
||||
var/new_name = pick("evil", "suspicious", "ominous", "donk-flavored", "robust", "sneaky")
|
||||
name = "[new_name] cigarette packet"
|
||||
|
||||
/*
|
||||
* Vial Box
|
||||
*/
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
var/obj/item/weapon/cell/high/bcell = null
|
||||
var/mob/foundmob = "" //Used in throwing proc.
|
||||
var/hitcost = 1500 //oh god why do power cells carry so much charge? We probably need to make a distinction between "industrial" sized power cells for APCs and power cells for everything else.
|
||||
var/allowharm = 0 // Allow or disallow harming with the stunbaton
|
||||
|
||||
/obj/item/weapon/melee/baton/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] is putting the live [name] in \his mouth! It looks like \he's trying to commit suicide.</span>")
|
||||
@@ -123,7 +124,7 @@
|
||||
var/mob/living/L = M
|
||||
|
||||
var/target_zone = check_zone(user.zone_sel.selecting)
|
||||
if(user.a_intent == "hurt")
|
||||
if(user.a_intent == "harm" && allowharm == 1)
|
||||
if (!..()) //item/attack() does it's own messaging and logs
|
||||
return 0 // item/attack() will return 1 if they hit, 0 if they missed.
|
||||
agony *= 0.5 //whacking someone causes a much poorer contact than prodding them.
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
return 0
|
||||
|
||||
/obj/item/weapon/melee/energy/sword/New()
|
||||
_color = pick("red","blue","green","purple")
|
||||
blade_color = pick("red","blue","green","purple")
|
||||
|
||||
/obj/item/weapon/melee/energy/sword/attack_self(mob/living/user as mob)
|
||||
if ((M_CLUMSY in user.mutations) && prob(50))
|
||||
@@ -36,7 +36,7 @@
|
||||
if(istype(src,/obj/item/weapon/melee/energy/sword/pirate))
|
||||
icon_state = "cutlass1"
|
||||
else
|
||||
icon_state = "sword[_color]"
|
||||
icon_state = "sword[blade_color]"
|
||||
w_class = 4
|
||||
playsound(user, 'sound/weapons/saberon.ogg', 50, 1)
|
||||
hitsound = 'sound/weapons/blade1.ogg'
|
||||
@@ -67,9 +67,29 @@
|
||||
user.adjustBrainLoss(10)
|
||||
else
|
||||
user << "<span class='notice'>You attach the ends of the two energy swords, making a single double-bladed weapon! You're cool.</span>"
|
||||
new /obj/item/weapon/twohanded/dualsaber(user.loc)
|
||||
var/obj/item/weapon/twohanded/dualsaber/newSaber = new /obj/item/weapon/twohanded/dualsaber(user.loc)
|
||||
if(src.hacked) // That's right, we'll only check the "original" esword.
|
||||
newSaber.hacked = 1
|
||||
newSaber.blade_color = "rainbow"
|
||||
del(W)
|
||||
del(src)
|
||||
|
||||
else if(istype(W, /obj/item/device/multitool))
|
||||
if(hacked == 0)
|
||||
hacked = 1
|
||||
blade_color = "rainbow"
|
||||
user << "<span class='warning'>RNBW_ENGAGE</span>"
|
||||
|
||||
if(active)
|
||||
icon_state = "swordrainbow"
|
||||
// Updating overlays, copied from welder code.
|
||||
// I tried calling attack_self twice, which looked cool, except it somehow didn't update the overlays!!
|
||||
if(user.r_hand == src)
|
||||
user.update_inv_r_hand(0)
|
||||
else if(user.l_hand == src)
|
||||
user.update_inv_l_hand(0)
|
||||
else
|
||||
user << "<span class='warning'>It's already fabulous!</span>"
|
||||
/*
|
||||
* Classic Baton
|
||||
*/
|
||||
@@ -215,8 +235,7 @@
|
||||
return
|
||||
else
|
||||
return ..()
|
||||
|
||||
|
||||
|
||||
/*
|
||||
*Energy Blade
|
||||
*/
|
||||
@@ -282,6 +301,7 @@
|
||||
active = !active
|
||||
if (active)
|
||||
force = 10
|
||||
reflect_chance = 80
|
||||
icon_state = "eshield[active]"
|
||||
w_class = 4
|
||||
playsound(user, 'sound/weapons/saberon.ogg', 50, 1)
|
||||
@@ -290,6 +310,7 @@
|
||||
force = 3
|
||||
icon_state = "eshield[active]"
|
||||
w_class = 1
|
||||
reflect_chance = 0
|
||||
playsound(user, 'sound/weapons/saberoff.ogg', 50, 1)
|
||||
user << "\blue [src] can now be concealed."
|
||||
if(istype(user,/mob/living/carbon/human))
|
||||
|
||||
@@ -128,26 +128,26 @@ Frequency:
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "hand_tele"
|
||||
item_state = "electronic"
|
||||
throwforce = 5
|
||||
throwforce = 0
|
||||
w_class = 2.0
|
||||
throw_speed = 3
|
||||
throw_range = 5
|
||||
m_amt = 10000
|
||||
origin_tech = "magnets=1;bluespace=3"
|
||||
var/active_portals = 0
|
||||
|
||||
/obj/item/weapon/hand_tele/attack_self(mob/user as mob)
|
||||
var/turf/current_location = get_turf(user)//What turf is the user on?
|
||||
if(!current_location||current_location.z==2||current_location.z>=8)//If turf was not found or they're on z level 2 or >8 which does not currently exist.
|
||||
if(!current_location||current_location.z==2||current_location.z>=7)//If turf was not found or they're on z level 2 or >7 which does not currently exist.
|
||||
user << "<span class='notice'>\The [src] is malfunctioning.</span>"
|
||||
return
|
||||
var/list/L = list( )
|
||||
for(var/obj/machinery/teleport/hub/R in world)
|
||||
var/obj/machinery/computer/teleporter/com = locate(/obj/machinery/computer/teleporter, locate(R.x - 2, R.y, R.z))
|
||||
if (istype(com, /obj/machinery/computer/teleporter) && com.locked && !com.one_time_use)
|
||||
if(R.icon_state == "tele1")
|
||||
L["[com.id] (Active)"] = com.locked
|
||||
for(var/obj/machinery/computer/teleporter/com in world)
|
||||
if(com.target)
|
||||
if(com.power_station && com.power_station.teleporter_hub && com.power_station.engaged)
|
||||
L["[com.id] (Active)"] = com.target
|
||||
else
|
||||
L["[com.id] (Inactive)"] = com.locked
|
||||
L["[com.id] (Inactive)"] = com.target
|
||||
var/list/turfs = list( )
|
||||
for(var/turf/T in orange(10))
|
||||
if(T.x>world.maxx-8 || T.x<8) continue //putting them at the edge is dumb
|
||||
@@ -158,19 +158,16 @@ Frequency:
|
||||
var/t1 = input(user, "Please select a teleporter to lock in on.", "Hand Teleporter") in L
|
||||
if ((user.get_active_hand() != src || user.stat || user.restrained()))
|
||||
return
|
||||
var/count = 0 //num of portals from this teleport in world
|
||||
for(var/obj/effect/portal/PO in world)
|
||||
if(PO.creator == src) count++
|
||||
if(count >= 3)
|
||||
if(active_portals >= 3)
|
||||
user.show_message("<span class='notice'>\The [src] is recharging!</span>")
|
||||
return
|
||||
var/T = L[t1]
|
||||
for(var/mob/O in hearers(user, null))
|
||||
O.show_message("<span class='notice'>Locked In.</span>", 2)
|
||||
user.show_message("<span class='notice'>Locked In.</span>", 2)
|
||||
var/obj/effect/portal/P = new /obj/effect/portal( get_turf(src) )
|
||||
P.target = T
|
||||
P.creator = src
|
||||
try_move_adjacent(P)
|
||||
active_portals++
|
||||
src.add_fingerprint(user)
|
||||
return
|
||||
|
||||
|
||||
|
||||
@@ -191,6 +191,9 @@ obj/item/weapon/twohanded/
|
||||
* Double-Bladed Energy Swords - Cheridan
|
||||
*/
|
||||
/obj/item/weapon/twohanded/dualsaber
|
||||
var/hacked = 0
|
||||
var/blade_color
|
||||
icon_override = 'icons/mob/in-hand/swords.dmi'
|
||||
icon_state = "dualsaber0"
|
||||
name = "double-bladed energy sword"
|
||||
desc = "Handle with care."
|
||||
@@ -210,20 +213,16 @@ obj/item/weapon/twohanded/
|
||||
edge = 1
|
||||
no_embed = 1 // Like with the single-handed esword, this shouldn't be embedding in people.
|
||||
|
||||
/* Here for when we can add items to left and right hands again, but currently this cannot be done due to the lack of in-hand icons for dual eswords aside from the green one.
|
||||
/obj/item/weapon/twohanded/dualsaber/New()
|
||||
item_color = pick("red", "blue", "green", "purple")
|
||||
blade_color = pick("red", "blue", "green", "purple")
|
||||
|
||||
/obj/item/weapon/twohanded/dualsaber/update_icon()
|
||||
if(wielded)
|
||||
icon_state = "dualsaber[item_color][wielded]"
|
||||
icon_state = "dualsaber[blade_color][wielded]"
|
||||
reflect_chance = 80
|
||||
else
|
||||
icon_state = "dualsaber0"
|
||||
*/
|
||||
|
||||
/obj/item/weapon/twohanded/dualsaber/update_icon()
|
||||
icon_state = "dualsaber[wielded]"
|
||||
return
|
||||
reflect_chance = 0
|
||||
|
||||
/obj/item/weapon/twohanded/dualsaber/attack(target as mob, mob/living/user as mob)
|
||||
..()
|
||||
@@ -245,11 +244,19 @@ obj/item/weapon/twohanded/
|
||||
|
||||
/obj/item/weapon/twohanded/dualsaber/green
|
||||
New()
|
||||
color = "green"
|
||||
blade_color = "green"
|
||||
|
||||
/obj/item/weapon/twohanded/dualsaber/red
|
||||
New()
|
||||
color = "red"
|
||||
blade_color = "red"
|
||||
|
||||
/obj/item/weapon/twohanded/dualsaber/purple
|
||||
New()
|
||||
blade_color = "purple"
|
||||
|
||||
/obj/item/weapon/twohanded/dualsaber/blue
|
||||
New()
|
||||
blade_color = "blue"
|
||||
|
||||
/obj/item/weapon/twohanded/dualsaber/unwield()
|
||||
..()
|
||||
@@ -259,6 +266,18 @@ obj/item/weapon/twohanded/
|
||||
..()
|
||||
hitsound = 'sound/weapons/blade1.ogg'
|
||||
|
||||
/obj/item/weapon/twohanded/dualsaber/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
..()
|
||||
if(istype(W, /obj/item/device/multitool))
|
||||
if(hacked == 0)
|
||||
hacked = 1
|
||||
user << "<span class='warning'>2XRNBW_ENGAGE</span>"
|
||||
blade_color = "rainbow"
|
||||
update_icon()
|
||||
else
|
||||
user << "<span class='warning'>It's starting to look like a triple rainbow - no, nevermind.</span>"
|
||||
|
||||
|
||||
//spears
|
||||
/obj/item/weapon/twohanded/spear
|
||||
icon_state = "spearglass0"
|
||||
@@ -284,4 +303,199 @@ obj/item/weapon/twohanded/
|
||||
/obj/item/weapon/twohanded/spear/kidan
|
||||
icon_state = "kidanspear0"
|
||||
name = "Kidan spear"
|
||||
desc = "A spear brought over from the Kidan homeworld."
|
||||
desc = "A spear brought over from the Kidan homeworld."
|
||||
|
||||
|
||||
// SINGULOHAMMER
|
||||
|
||||
/obj/item/weapon/twohanded/singularityhammer
|
||||
name = "singularity hammer"
|
||||
desc = "The pinnacle of close combat technology, the hammer harnesses the power of a miniaturized singularity to deal crushing blows."
|
||||
|
||||
icon_override = 'icons/mob/in-hand/swords.dmi'
|
||||
icon_state = "mjollnir0"
|
||||
flags = CONDUCT
|
||||
slot_flags = SLOT_BACK
|
||||
no_embed = 1
|
||||
force = 5
|
||||
force_unwielded = 5
|
||||
force_wielded = 20
|
||||
throwforce = 15
|
||||
throw_range = 1
|
||||
w_class = 5
|
||||
var/charged = 5
|
||||
origin_tech = "combat=5;bluespace=4"
|
||||
|
||||
|
||||
|
||||
/obj/item/weapon/twohanded/singularityhammer/New()
|
||||
..()
|
||||
processing_objects.Add(src)
|
||||
|
||||
|
||||
/obj/item/weapon/twohanded/singularityhammer/Destroy()
|
||||
processing_objects.Remove(src)
|
||||
..()
|
||||
|
||||
|
||||
/obj/item/weapon/twohanded/singularityhammer/process()
|
||||
if(charged < 5)
|
||||
charged++
|
||||
return
|
||||
|
||||
/obj/item/weapon/twohanded/singularityhammer/update_icon() //Currently only here to fuck with the on-mob icons.
|
||||
icon_state = "mjollnir[wielded]"
|
||||
return
|
||||
|
||||
|
||||
/obj/item/weapon/twohanded/singularityhammer/proc/vortex(var/turf/pull as turf, mob/wielder as mob)
|
||||
for(var/atom/X in orange(5,pull))
|
||||
if(istype(X, /atom/movable))
|
||||
if(X == wielder) continue
|
||||
if((X) &&(!X:anchored) && (!istype(X,/mob/living/carbon/human)))
|
||||
step_towards(X,pull)
|
||||
step_towards(X,pull)
|
||||
step_towards(X,pull)
|
||||
else if(istype(X,/mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = X
|
||||
if(istype(H.shoes,/obj/item/clothing/shoes/magboots))
|
||||
var/obj/item/clothing/shoes/magboots/M = H.shoes
|
||||
if(M.magpulse)
|
||||
continue
|
||||
H.apply_effect(1, WEAKEN, 0)
|
||||
step_towards(H,pull)
|
||||
step_towards(H,pull)
|
||||
step_towards(H,pull)
|
||||
return
|
||||
|
||||
|
||||
|
||||
/obj/item/weapon/twohanded/singularityhammer/afterattack(atom/A as mob|obj|turf|area, mob/user as mob, proximity)
|
||||
if(!proximity) return
|
||||
if(wielded)
|
||||
if(charged == 5)
|
||||
charged = 0
|
||||
if(istype(A, /mob/living/))
|
||||
var/mob/living/Z = A
|
||||
Z.take_organ_damage(20,0)
|
||||
playsound(user, 'sound/weapons/marauder.ogg', 50, 1)
|
||||
var/turf/target = get_turf(A)
|
||||
vortex(target,user)
|
||||
|
||||
|
||||
/obj/item/weapon/twohanded/mjollnir
|
||||
name = "Mjollnir"
|
||||
desc = "A weapon worthy of a god, able to strike with the force of a lightning bolt. It crackles with barely contained energy."
|
||||
icon_override = 'icons/mob/in-hand/swords.dmi'
|
||||
icon_state = "mjollnir0"
|
||||
flags = CONDUCT
|
||||
slot_flags = SLOT_BACK
|
||||
no_embed = 1
|
||||
force = 5
|
||||
force_unwielded = 5
|
||||
force_wielded = 20
|
||||
throwforce = 30
|
||||
throw_range = 7
|
||||
w_class = 5
|
||||
//var/charged = 5
|
||||
origin_tech = "combat=5;powerstorage=5"
|
||||
|
||||
/obj/item/weapon/twohanded/mjollnir/proc/shock(mob/living/target as mob)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread()
|
||||
s.set_up(5, 1, target.loc)
|
||||
s.start()
|
||||
target.take_organ_damage(0,30)
|
||||
target.visible_message("<span class='danger'>[target.name] was shocked by the [src.name]!</span>", \
|
||||
"<span class='userdanger'>You feel a powerful shock course through your body sending you flying!</span>", \
|
||||
"<span class='danger'>You hear a heavy electrical crack.</span>")
|
||||
var/atom/throw_target = get_edge_target_turf(target, get_dir(src, get_step_away(target, src)))
|
||||
target.throw_at(throw_target, 200, 4)
|
||||
return
|
||||
|
||||
|
||||
/obj/item/weapon/twohanded/mjollnir/attack(mob/M as mob, mob/user as mob)
|
||||
..()
|
||||
spawn(0)
|
||||
if(wielded)
|
||||
//if(charged == 5)
|
||||
//charged = 0
|
||||
playsound(src.loc, "sparks", 50, 1)
|
||||
if(istype(M, /mob/living))
|
||||
M.Stun(10)
|
||||
shock(M)
|
||||
|
||||
|
||||
/obj/item/weapon/twohanded/mjollnir/update_icon() //Currently only here to fuck with the on-mob icons.
|
||||
icon_state = "mjollnir[wielded]"
|
||||
return
|
||||
|
||||
|
||||
|
||||
/obj/item/weapon/twohanded/knighthammer
|
||||
name = "singuloth knight's hammer"
|
||||
desc = "A hammer made of sturdy metal with a golden skull adorned with wings on either side of the head. <br>This weapon causes devastating damage to those it hits due to a power field sustained by a mini-singularity inside of the hammer."
|
||||
|
||||
icon_override = 'icons/mob/in-hand/swords.dmi'
|
||||
icon_state = "adrhammer0"
|
||||
flags = CONDUCT
|
||||
slot_flags = SLOT_BACK
|
||||
no_embed = 1
|
||||
force = 5
|
||||
force_unwielded = 5
|
||||
force_wielded = 20
|
||||
throwforce = 15
|
||||
throw_range = 1
|
||||
w_class = 5
|
||||
var/charged = 5
|
||||
origin_tech = "combat=5;bluespace=4"
|
||||
|
||||
|
||||
|
||||
/obj/item/weapon/twohanded/knighthammer/New()
|
||||
..()
|
||||
processing_objects.Add(src)
|
||||
|
||||
|
||||
/obj/item/weapon/twohanded/knighthammer/Destroy()
|
||||
processing_objects.Remove(src)
|
||||
..()
|
||||
|
||||
|
||||
/obj/item/weapon/twohanded/knighthammer/process()
|
||||
if(charged < 5)
|
||||
charged++
|
||||
return
|
||||
|
||||
/obj/item/weapon/twohanded/knighthammer/update_icon() //Currently only here to fuck with the on-mob icons.
|
||||
icon_state = "adrhammer[wielded]"
|
||||
return
|
||||
|
||||
|
||||
/obj/item/weapon/twohanded/knighthammer/afterattack(atom/A as mob|obj|turf|area, mob/user as mob, proximity)
|
||||
if(!proximity) return
|
||||
if(wielded)
|
||||
if(charged == 5)
|
||||
charged = 0
|
||||
if(istype(A, /mob/living/))
|
||||
var/mob/living/Z = A
|
||||
if(Z.health < 1)
|
||||
Z.visible_message("<span class='danger'>[Z.name] was blown to peices by the power of [src.name]!</span>", \
|
||||
"<span class='userdanger'>You feel a powerful blow rip you apart!</span>", \
|
||||
"<span class='danger'>You hear a heavy impact and the sound of ripping flesh!.</span>")
|
||||
Z.gib()
|
||||
else
|
||||
Z.take_organ_damage(0,30)
|
||||
Z.visible_message("<span class='danger'>[Z.name] was sent flying by a blow from the [src.name]!</span>", \
|
||||
"<span class='userdanger'>You feel a powerful blow connect with your body and send you flying!</span>", \
|
||||
"<span class='danger'>You hear something heavy impact flesh!.</span>")
|
||||
var/atom/throw_target = get_edge_target_turf(Z, get_dir(src, get_step_away(Z, src)))
|
||||
Z.throw_at(throw_target, 200, 4)
|
||||
else if(istype(A, /turf/simulated/wall))
|
||||
var/turf/simulated/wall/Z = A
|
||||
Z.ex_act(2)
|
||||
charged = 3
|
||||
else if (istype(A, /obj/structure) || istype(A, /obj/mecha/))
|
||||
var/obj/Z = A
|
||||
Z.ex_act(2)
|
||||
charged = 3
|
||||
playsound(user, 'sound/weapons/marauder.ogg', 50, 1)
|
||||
|
||||
@@ -1,58 +1,59 @@
|
||||
/obj/item/weapon/vending_refill
|
||||
name = "Resupply canister"
|
||||
name = "resupply canister"
|
||||
var/machine_name = "Generic"
|
||||
|
||||
icon = 'icons/obj/vending_restock.dmi'
|
||||
icon_state = "refill_snack"
|
||||
item_state = "restock_unit"
|
||||
flags = FPRINT | TABLEPASS| CONDUCT
|
||||
flags = CONDUCT
|
||||
force = 7.0
|
||||
throwforce = 15.0
|
||||
throwforce = 10.0
|
||||
throw_speed = 1
|
||||
throw_range = 7
|
||||
w_class = 4.0
|
||||
|
||||
var/charges = 0 //how many restocking "charges" the refill has
|
||||
|
||||
/obj/item/weapon/vending_refill/New()
|
||||
/obj/item/weapon/vending_refill/New(amt = -1)
|
||||
..()
|
||||
name = "\improper [machine_name] restocking unit"
|
||||
if(isnum(amt) && amt > -1)
|
||||
charges = amt
|
||||
|
||||
/obj/item/weapon/vending_refill/examine()
|
||||
set src in usr
|
||||
/obj/item/weapon/vending_refill/examine(mob/user)
|
||||
..()
|
||||
if(charges)
|
||||
usr << "It can restock [charges] item(s)."
|
||||
user << "It can restock [charges] item(s)."
|
||||
else
|
||||
usr << "It's empty!"
|
||||
user << "It's empty!"
|
||||
|
||||
//NOTE I decided to go for about 1/3 of a machine's capacity
|
||||
|
||||
/obj/item/weapon/vending_refill/boozeomat
|
||||
machine_name = "Booze-O-Mat"
|
||||
icon_state = "refill_booze"
|
||||
charges = 50//of 138
|
||||
charges = 46//of 138
|
||||
|
||||
/obj/item/weapon/vending_refill/coffee
|
||||
machine_name = "hot drinks"
|
||||
icon_state = "refill_joe"
|
||||
charges = 30//of 85
|
||||
charges = 28//of 85
|
||||
|
||||
/obj/item/weapon/vending_refill/snack
|
||||
machine_name = "Getmore Chocolate Corp"
|
||||
charges = 15//of 48
|
||||
charges = 16//of 48
|
||||
|
||||
/obj/item/weapon/vending_refill/cola
|
||||
machine_name = "Robust Softdrinks"
|
||||
icon_state = "refill_cola"
|
||||
charges = 20//of 65
|
||||
charges = 21//of 65
|
||||
|
||||
/obj/item/weapon/vending_refill/cigarette
|
||||
machine_name = "cigarette"
|
||||
icon_state = "refill_smoke"
|
||||
charges = 10// of 30
|
||||
charges = 9// of 30
|
||||
|
||||
/obj/item/weapon/vending_refill/autodrobe
|
||||
machine_name = "AutoDrobe"
|
||||
icon_state = "refill_costume"
|
||||
charges = 28// of 58
|
||||
charges = 19// of 58
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
if(climbable)
|
||||
structure_shaken()
|
||||
|
||||
return
|
||||
return 1
|
||||
|
||||
/obj/structure/closet/crate/close()
|
||||
if(!src.opened)
|
||||
|
||||
@@ -1,3 +1,41 @@
|
||||
//This proc is called in master-controller, and updates the color of all windows and windoors on the map
|
||||
var/global/wcBar
|
||||
var/global/wcBrig
|
||||
var/global/wcCommon
|
||||
var/global/wcColored
|
||||
/proc/color_windows_init()
|
||||
var/list/bar = list("#0d8395", "#58b5c3", "#58c366", "#90d79a", "#ffffff")
|
||||
var/list/brig = list("#aa0808", "#7f0606", "#ff0000")
|
||||
var/list/common = list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8fcf44", "#ffffff")
|
||||
|
||||
wcBar = pick(bar)
|
||||
wcBrig = pick(brig)
|
||||
wcCommon = pick(common)
|
||||
|
||||
/obj/proc/color_windows(var/obj/W as obj)
|
||||
if(!wcColored)
|
||||
sleep(50) // Sleeping to make sure the glass has initialized on the map
|
||||
wcColored = 1
|
||||
|
||||
var/list/wcBarAreas = list(/area/crew_quarters/bar)
|
||||
var/list/wcBrigAreas = list(/area/security,/area/security/main,/area/security/lobby,/area/security/brig,/area/security/permabrig,/area/security/prison,/area/security/prison/cell_block/A,/area/security/prison/cell_block/B,/area/security/prison/cell_block/C,/area/security/execution,/area/security/processing,/area/security/interrogation,/area/security/interrogationobs,/area/security/evidence,/area/security/prisonlockers,/area/security/medbay,/area/security/processing,/area/security/warden,/area/security/armoury,/area/security/securearmoury,/area/security/armoury/gamma,/area/security/securehallway,/area/security/hos,/area/security/podbay,/area/security/detectives_office,/area/security/range,/area/security/nuke_storage,/area/security/checkpoint,/area/security/checkpoint2,/area/security/checkpoint2,/area/security/checkpoint/supply,/area/security/checkpoint/engineering,/area/security/checkpoint/medical,/area/security/checkpoint/science,/area/security/vacantoffice,/area/security/vacantoffice2,/area/prison,/area/prison/arrival_airlock,/area/prison/control,/area/prison/crew_quarters,/area/prison/rec_room,/area/prison/closet,/area/prison/hallway/fore,/area/prison/hallway/aft,/area/prison/hallway/port,/area/prison/hallway/starboard,/area/prison/morgue,/area/prison/medical_research,/area/prison/medical,/area/prison/solar,/area/prison/podbay,/area/prison/solar_control,/area/prison/solitary,/area/prison/cell_block,/area/prison/cell_block/A,/area/prison/cell_block/B,/area/prison/cell_block/C)
|
||||
|
||||
var/newcolor
|
||||
for(var/A in wcBarAreas)
|
||||
if(W.areaMaster == locate(A))
|
||||
newcolor = wcBar
|
||||
break
|
||||
|
||||
for(var/A in wcBrigAreas)
|
||||
if(W.areaMaster == locate(A))
|
||||
newcolor = wcBrig
|
||||
break
|
||||
|
||||
if(!newcolor)
|
||||
newcolor = wcCommon
|
||||
|
||||
return newcolor
|
||||
|
||||
/obj/structure/window
|
||||
name = "window"
|
||||
desc = "A window."
|
||||
@@ -18,9 +56,8 @@
|
||||
var/sheets = 1 // Number of sheets needed to build this window (determines how much shit is spawned by destroy())
|
||||
// var/silicate = 0 // number of units of silicate
|
||||
// var/icon/silicateIcon = null // the silicated icon
|
||||
|
||||
|
||||
/obj/structure/window/bullet_act(var/obj/item/projectile/Proj)
|
||||
|
||||
//Tasers and the like should not damage windows.
|
||||
if(Proj.damage_type == HALLOSS)
|
||||
return
|
||||
@@ -338,31 +375,14 @@
|
||||
silicateIcon = I
|
||||
*/
|
||||
|
||||
|
||||
/obj/structure/window/New(Loc,re=0)
|
||||
..()
|
||||
|
||||
// if(re) reinf = re
|
||||
|
||||
ini_dir = dir
|
||||
/* if(reinf)
|
||||
icon_state = "rwindow"
|
||||
desc = "A reinforced window."
|
||||
name = "reinforced window"
|
||||
state = 2*anchored
|
||||
health = 40
|
||||
if(opacity)
|
||||
icon_state = "twindow"
|
||||
else
|
||||
icon_state = "window"*/
|
||||
|
||||
color = color_windows()
|
||||
color = color_windows(src)
|
||||
update_nearby_tiles(need_rebuild=1)
|
||||
update_nearby_icons()
|
||||
|
||||
return
|
||||
|
||||
|
||||
/obj/structure/window/Destroy()
|
||||
density = 0
|
||||
update_nearby_tiles()
|
||||
@@ -479,6 +499,4 @@
|
||||
desc = "It looks rather strong and frosted over. Looks like it might take a few less hits then a normal reinforced window."
|
||||
icon_state = "fwindow"
|
||||
basestate = "fwindow"
|
||||
health = 30
|
||||
|
||||
|
||||
health = 30
|
||||
Reference in New Issue
Block a user