mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-30 07:27:57 +01:00
Keeping up to date.
This commit is contained in:
@@ -0,0 +1,410 @@
|
||||
#define AB_CHECK_RESTRAINED 1
|
||||
#define AB_CHECK_STUNNED 2
|
||||
#define AB_CHECK_LYING 4
|
||||
#define AB_CHECK_CONSCIOUS 8
|
||||
|
||||
|
||||
/datum/action
|
||||
var/name = "Generic Action"
|
||||
var/desc = null
|
||||
var/obj/target = null
|
||||
var/check_flags = 0
|
||||
var/processing = 0
|
||||
var/obj/screen/movable/action_button/button = null
|
||||
var/button_icon = 'icons/mob/actions.dmi'
|
||||
var/background_icon_state = "bg_default"
|
||||
|
||||
var/icon_icon = 'icons/mob/actions.dmi'
|
||||
var/button_icon_state = "default"
|
||||
var/mob/owner
|
||||
|
||||
/datum/action/New(var/Target)
|
||||
target = Target
|
||||
button = new
|
||||
button.linked_action = src
|
||||
button.name = name
|
||||
|
||||
/datum/action/Destroy()
|
||||
if(owner)
|
||||
Remove(owner)
|
||||
if(target)
|
||||
target = null
|
||||
qdel(button)
|
||||
button = null
|
||||
return ..()
|
||||
|
||||
/datum/action/proc/Grant(mob/M)
|
||||
if(owner)
|
||||
if(owner == M)
|
||||
return
|
||||
Remove(owner)
|
||||
owner = M
|
||||
M.actions += src
|
||||
if(M.client)
|
||||
M.client.screen += button
|
||||
M.update_action_buttons()
|
||||
|
||||
/datum/action/proc/Remove(mob/M)
|
||||
if(M.client)
|
||||
M.client.screen -= button
|
||||
button.moved = FALSE //so the button appears in its normal position when given to another owner.
|
||||
M.actions -= src
|
||||
M.update_action_buttons()
|
||||
owner = null
|
||||
|
||||
/datum/action/proc/Trigger()
|
||||
if(!IsAvailable())
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/datum/action/proc/Process()
|
||||
return
|
||||
|
||||
/datum/action/proc/IsAvailable()// returns 1 if all checks pass
|
||||
if(!owner)
|
||||
return 0
|
||||
if(check_flags & AB_CHECK_RESTRAINED)
|
||||
if(owner.restrained())
|
||||
return 0
|
||||
if(check_flags & AB_CHECK_STUNNED)
|
||||
if(owner.stunned || owner.weakened)
|
||||
return 0
|
||||
if(check_flags & AB_CHECK_LYING)
|
||||
if(owner.lying)
|
||||
return 0
|
||||
if(check_flags & AB_CHECK_CONSCIOUS)
|
||||
if(owner.stat)
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/datum/action/proc/UpdateButtonIcon()
|
||||
if(button)
|
||||
button.icon = button_icon
|
||||
button.icon_state = background_icon_state
|
||||
|
||||
ApplyIcon(button)
|
||||
|
||||
if(!IsAvailable())
|
||||
button.color = rgb(128,0,0,128)
|
||||
else
|
||||
button.color = rgb(255,255,255,255)
|
||||
return 1
|
||||
|
||||
/datum/action/proc/ApplyIcon(obj/screen/movable/action_button/current_button)
|
||||
current_button.overlays.Cut()
|
||||
if(icon_icon && button_icon_state)
|
||||
var/image/img
|
||||
img = image(icon_icon, current_button, button_icon_state)
|
||||
img.pixel_x = 0
|
||||
img.pixel_y = 0
|
||||
current_button.overlays += img
|
||||
|
||||
//Presets for item actions
|
||||
/datum/action/item_action
|
||||
check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING|AB_CHECK_CONSCIOUS
|
||||
|
||||
/datum/action/item_action/New(Target)
|
||||
..()
|
||||
var/obj/item/I = target
|
||||
I.actions += src
|
||||
|
||||
/datum/action/item_action/Destroy()
|
||||
var/obj/item/I = target
|
||||
I.actions -= src
|
||||
return ..()
|
||||
|
||||
/datum/action/item_action/Trigger()
|
||||
if(!..())
|
||||
return 0
|
||||
if(target)
|
||||
var/obj/item/I = target
|
||||
I.ui_action_click(owner, type)
|
||||
return 1
|
||||
|
||||
/datum/action/item_action/ApplyIcon(obj/screen/movable/action_button/current_button)
|
||||
current_button.overlays.Cut()
|
||||
if(target)
|
||||
var/obj/item/I = target
|
||||
var/old_layer = I.layer
|
||||
var/old_plane = I.plane
|
||||
I.layer = 21
|
||||
I.plane = HUD_PLANE
|
||||
current_button.overlays += I
|
||||
I.layer = old_layer
|
||||
I.plane = old_plane
|
||||
|
||||
/datum/action/item_action/toggle_light
|
||||
name = "Toggle Light"
|
||||
|
||||
/datum/action/item_action/toggle_hood
|
||||
name = "Toggle Hood"
|
||||
|
||||
/datum/action/item_action/toggle_firemode
|
||||
name = "Toggle Firemode"
|
||||
|
||||
/datum/action/item_action/startchainsaw
|
||||
name = "Pull The Starting Cord"
|
||||
|
||||
/datum/action/item_action/toggle_gunlight
|
||||
name = "Toggle Gunlight"
|
||||
|
||||
/datum/action/item_action/toggle_mode
|
||||
name = "Toggle Mode"
|
||||
|
||||
/datum/action/item_action/toggle_barrier_spread
|
||||
name = "Toggle Barrier Spread"
|
||||
|
||||
/datum/action/item_action/equip_unequip_TED_Gun
|
||||
name = "Equip/Unequip TED Gun"
|
||||
|
||||
/datum/action/item_action/toggle_paddles
|
||||
name = "Toggle Paddles"
|
||||
|
||||
/datum/action/item_action/set_internals
|
||||
name = "Set Internals"
|
||||
|
||||
/datum/action/item_action/set_internals/UpdateButtonIcon()
|
||||
if(..()) //button available
|
||||
if(iscarbon(owner))
|
||||
var/mob/living/carbon/C = owner
|
||||
if(target == C.internal)
|
||||
button.icon_state = "bg_default_on"
|
||||
|
||||
/datum/action/item_action/toggle_mister
|
||||
name = "Toggle Mister"
|
||||
|
||||
/datum/action/item_action/toggle_helmet_light
|
||||
name = "Toggle Helmet Light"
|
||||
|
||||
/datum/action/item_action/toggle_helmet_mode
|
||||
name = "Toggle Helmet Mode"
|
||||
|
||||
/datum/action/item_action/toggle_hardsuit_mode
|
||||
name = "Toggle Hardsuit Mode"
|
||||
|
||||
/datum/action/item_action/toggle
|
||||
|
||||
/datum/action/item_action/toggle/New(Target)
|
||||
..()
|
||||
name = "Toggle [target.name]"
|
||||
button.name = name
|
||||
|
||||
/datum/action/item_action/openclose
|
||||
|
||||
/datum/action/item_action/openclose/New(Target)
|
||||
..()
|
||||
name = "Open/Close [target.name]"
|
||||
button.name = name
|
||||
|
||||
/datum/action/item_action/button
|
||||
|
||||
/datum/action/item_action/button/New(Target)
|
||||
..()
|
||||
name = "Button/Unbutton [target.name]"
|
||||
button.name = name
|
||||
|
||||
/datum/action/item_action/zipper
|
||||
|
||||
/datum/action/item_action/zipper/New(Target)
|
||||
..()
|
||||
name = "Zip/Unzip [target.name]"
|
||||
button.name = name
|
||||
|
||||
/datum/action/item_action/halt
|
||||
name = "HALT!"
|
||||
|
||||
/datum/action/item_action/hoot
|
||||
name = "Hoot"
|
||||
|
||||
/datum/action/item_action/caw
|
||||
name = "Caw"
|
||||
|
||||
/datum/action/item_action/toggle_voice_box
|
||||
name = "Toggle Voice Box"
|
||||
|
||||
/datum/action/item_action/change
|
||||
name = "Change"
|
||||
|
||||
/datum/action/item_action/noir
|
||||
name = "Noir"
|
||||
|
||||
/datum/action/item_action/YEEEAAAAAHHHHHHHHHHHHH
|
||||
name = "YEAH!"
|
||||
|
||||
/datum/action/item_action/adjust
|
||||
|
||||
/datum/action/item_action/adjust/New(Target)
|
||||
..()
|
||||
name = "Adjust [target.name]"
|
||||
button.name = name
|
||||
|
||||
/datum/action/item_action/switch_hud
|
||||
name = "Switch HUD"
|
||||
|
||||
/datum/action/item_action/toggle_wings
|
||||
name = "Toggle Wings"
|
||||
|
||||
/datum/action/item_action/toggle_helmet
|
||||
name = "Toggle Helmet"
|
||||
|
||||
/datum/action/item_action/toggle_jetpack
|
||||
name = "Toggle Jetpack"
|
||||
|
||||
/datum/action/item_action/jetpack_stabilization
|
||||
name = "Toggle Jetpack Stabilization"
|
||||
|
||||
/datum/action/item_action/jetpack_stabilization/IsAvailable()
|
||||
var/obj/item/weapon/tank/jetpack/J = target
|
||||
if(!istype(J) || !J.on)
|
||||
return 0
|
||||
return ..()
|
||||
|
||||
/datum/action/item_action/hands_free
|
||||
check_flags = AB_CHECK_CONSCIOUS
|
||||
|
||||
/datum/action/item_action/hands_free/activate
|
||||
name = "Activate"
|
||||
|
||||
/datum/action/item_action/toggle_research_scanner
|
||||
name = "Toggle Research Scanner"
|
||||
button_icon_state = "scan_mode"
|
||||
|
||||
/datum/action/item_action/toggle_research_scanner/Trigger()
|
||||
if(IsAvailable())
|
||||
owner.research_scanner = !owner.research_scanner
|
||||
to_chat(owner, "<span class='notice'>Research analyzer is now [owner.research_scanner ? "active" : "deactivated"].</span>")
|
||||
return 1
|
||||
|
||||
/datum/action/item_action/toggle_research_scanner/Remove(mob/living/L)
|
||||
if(owner)
|
||||
owner.research_scanner = 0
|
||||
..()
|
||||
|
||||
/datum/action/item_action/toggle_research_scanner/ApplyIcon(obj/screen/movable/action_button/current_button)
|
||||
current_button.overlays.Cut()
|
||||
if(button_icon && button_icon_state)
|
||||
var/image/img = image(button_icon, current_button, "scan_mode")
|
||||
current_button.overlays += img
|
||||
|
||||
/datum/action/item_action/remove_badge
|
||||
name = "Remove Holobadge"
|
||||
|
||||
///prset for organ actions
|
||||
/datum/action/item_action/organ_action
|
||||
check_flags = AB_CHECK_CONSCIOUS
|
||||
|
||||
/datum/action/item_action/organ_action/IsAvailable()
|
||||
var/obj/item/organ/internal/I = target
|
||||
if(!I.owner)
|
||||
return 0
|
||||
return ..()
|
||||
|
||||
/datum/action/item_action/organ_action/toggle
|
||||
|
||||
/datum/action/item_action/organ_action/toggle/New(Target)
|
||||
..()
|
||||
name = "Toggle [target.name]"
|
||||
button.name = name
|
||||
|
||||
// for clothing accessories like holsters
|
||||
/datum/action/item_action/accessory
|
||||
check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING|AB_CHECK_CONSCIOUS
|
||||
|
||||
/datum/action/item_action/accessory/IsAvailable()
|
||||
. = ..()
|
||||
if(!.)
|
||||
return 0
|
||||
if(target.loc == owner)
|
||||
return 1
|
||||
if(istype(target.loc, /obj/item/clothing/under) && target.loc.loc == owner)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/datum/action/item_action/accessory/holster
|
||||
name = "Holster"
|
||||
|
||||
/datum/action/item_action/accessory/storage
|
||||
name = "View Storage"
|
||||
|
||||
|
||||
//Preset for spells
|
||||
/datum/action/spell_action
|
||||
check_flags = 0
|
||||
background_icon_state = "bg_spell"
|
||||
|
||||
/datum/action/spell_action/New(Target)
|
||||
..()
|
||||
var/obj/effect/proc_holder/spell/S = target
|
||||
S.action = src
|
||||
name = S.name
|
||||
button_icon = S.action_icon
|
||||
button_icon_state = S.action_icon_state
|
||||
background_icon_state = S.action_background_icon_state
|
||||
button.name = name
|
||||
|
||||
/datum/action/spell_action/Destroy()
|
||||
var/obj/effect/proc_holder/spell/S = target
|
||||
S.action = null
|
||||
return ..()
|
||||
|
||||
/datum/action/spell_action/Trigger()
|
||||
if(!..())
|
||||
return 0
|
||||
if(target)
|
||||
var/obj/effect/proc_holder/spell = target
|
||||
spell.Click()
|
||||
return 1
|
||||
|
||||
/datum/action/spell_action/IsAvailable()
|
||||
if(!target)
|
||||
return 0
|
||||
var/obj/effect/proc_holder/spell/spell = target
|
||||
|
||||
if(owner)
|
||||
return spell.can_cast(owner)
|
||||
return 0
|
||||
|
||||
/*
|
||||
/datum/action/spell_action/alien
|
||||
|
||||
/datum/action/spell_action/alien/IsAvailable()
|
||||
if(!target)
|
||||
return 0
|
||||
var/obj/effect/proc_holder/alien/ab = target
|
||||
|
||||
if(owner)
|
||||
return ab.cost_check(ab.check_turf, owner, 1)
|
||||
return 0
|
||||
*/
|
||||
|
||||
//Preset for general and toggled actions
|
||||
/datum/action/innate
|
||||
check_flags = 0
|
||||
var/active = 0
|
||||
|
||||
/datum/action/innate/Trigger()
|
||||
if(!..())
|
||||
return 0
|
||||
if(!active)
|
||||
Activate()
|
||||
else
|
||||
Deactivate()
|
||||
return 1
|
||||
|
||||
/datum/action/innate/proc/Activate()
|
||||
return
|
||||
|
||||
/datum/action/innate/proc/Deactivate()
|
||||
return
|
||||
|
||||
//Preset for action that call specific procs (consider innate)
|
||||
/datum/action/generic
|
||||
check_flags = 0
|
||||
var/procname
|
||||
|
||||
/datum/action/generic/Trigger()
|
||||
if(!..())
|
||||
return 0
|
||||
if(target && procname)
|
||||
call(target,procname)(usr)
|
||||
return 1
|
||||
+15
-29
@@ -990,7 +990,6 @@
|
||||
qdel(H.head)
|
||||
qdel(H.shoes)
|
||||
qdel(H.wear_id)
|
||||
qdel(H.wear_pda)
|
||||
qdel(H.wear_suit)
|
||||
qdel(H.w_uniform)
|
||||
|
||||
@@ -1056,18 +1055,13 @@
|
||||
switch(href_list["shadowling"])
|
||||
if("clear")
|
||||
ticker.mode.update_shadow_icons_removed(src)
|
||||
current.spell_list.Cut()
|
||||
if(src in ticker.mode.shadows)
|
||||
ticker.mode.shadows -= src
|
||||
special_role = null
|
||||
to_chat(current, "<span class='userdanger'>Your powers have been quenched! You are no longer a shadowling!</span>")
|
||||
current.spell_list.Cut()
|
||||
if(current.mind)
|
||||
current.mind.spell_list.Cut()
|
||||
message_admins("[key_name_admin(usr)] has de-shadowlinged [current].")
|
||||
log_admin("[key_name(usr)] has de-shadowlinged [current].")
|
||||
remove_spell(/obj/effect/proc_holder/spell/targeted/shadowling_hatch)
|
||||
remove_spell(/obj/effect/proc_holder/spell/targeted/shadowling_ascend)
|
||||
current.spellremove(current)
|
||||
current.remove_language("Shadowling Hivemind")
|
||||
else if(src in ticker.mode.shadowling_thralls)
|
||||
ticker.mode.remove_thrall(src,0)
|
||||
@@ -1322,7 +1316,6 @@
|
||||
qdel(H.head)
|
||||
qdel(H.shoes)
|
||||
qdel(H.wear_id)
|
||||
qdel(H.wear_pda)
|
||||
qdel(H.wear_suit)
|
||||
qdel(H.w_uniform)
|
||||
|
||||
@@ -1490,17 +1483,17 @@
|
||||
|
||||
return (duration <= world.time - brigged_since)
|
||||
|
||||
/datum/mind/proc/AddSpell(var/obj/effect/proc_holder/spell/spell)
|
||||
spell_list += spell
|
||||
if(!spell.action)
|
||||
spell.action = new/datum/action/spell_action
|
||||
spell.action.target = spell
|
||||
spell.action.name = spell.name
|
||||
spell.action.button_icon = spell.action_icon
|
||||
spell.action.button_icon_state = spell.action_icon_state
|
||||
spell.action.background_icon_state = spell.action_background_icon_state
|
||||
spell.action.Grant(current)
|
||||
return
|
||||
/datum/mind/proc/AddSpell(obj/effect/proc_holder/spell/S)
|
||||
spell_list += S
|
||||
S.action.Grant(current)
|
||||
|
||||
/datum/mind/proc/RemoveSpell(obj/effect/proc_holder/spell/spell) //To remove a specific spell from a mind
|
||||
if(!spell)
|
||||
return
|
||||
for(var/obj/effect/proc_holder/spell/S in spell_list)
|
||||
if(istype(S, spell))
|
||||
qdel(S)
|
||||
spell_list -= S
|
||||
|
||||
/datum/mind/proc/transfer_actions(var/mob/living/new_character)
|
||||
if(current && current.actions)
|
||||
@@ -1509,16 +1502,9 @@
|
||||
transfer_mindbound_actions(new_character)
|
||||
|
||||
/datum/mind/proc/transfer_mindbound_actions(var/mob/living/new_character)
|
||||
for(var/obj/effect/proc_holder/spell/spell in spell_list)
|
||||
if(!spell.action) // Unlikely but whatever
|
||||
spell.action = new/datum/action/spell_action
|
||||
spell.action.target = spell
|
||||
spell.action.name = spell.name
|
||||
spell.action.button_icon = spell.action_icon
|
||||
spell.action.button_icon_state = spell.action_icon_state
|
||||
spell.action.background_icon_state = spell.action_background_icon_state
|
||||
spell.action.Grant(new_character)
|
||||
return
|
||||
for(var/X in spell_list)
|
||||
var/obj/effect/proc_holder/spell/S = X
|
||||
S.action.Grant(new_character)
|
||||
|
||||
/datum/mind/proc/get_ghost(even_if_they_cant_reenter)
|
||||
for(var/mob/dead/observer/G in dead_mob_list)
|
||||
|
||||
@@ -57,7 +57,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
|
||||
|
||||
/obj/effect/proc_holder/spell/proc/cast_check(skipcharge = 0, mob/living/user = usr) //checks if the spell can be cast based on its settings; skipcharge is used when an additional cast_check is called inside the spell
|
||||
|
||||
if(((!user.mind) || !(src in user.mind.spell_list)) && !(src in user.spell_list))
|
||||
if(((!user.mind) || !(src in user.mind.spell_list)) && !(src in user.mob_spell_list))
|
||||
to_chat(user, "<span class='warning'>You shouldn't have this spell! Something's wrong.</span>")
|
||||
return 0
|
||||
if(istype(user, /mob/living/carbon/human))
|
||||
@@ -91,7 +91,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
|
||||
if(ishuman(user) && (invocation_type == "whisper" || invocation_type == "shout") && user.is_muzzled())
|
||||
to_chat(user, "Mmmf mrrfff!")
|
||||
return 0
|
||||
var/obj/effect/proc_holder/spell/noclothes/spell = locate() in (user.spell_list | (user.mind ? user.mind.spell_list : list()))
|
||||
var/obj/effect/proc_holder/spell/noclothes/spell = locate() in (user.mob_spell_list | (user.mind ? user.mind.spell_list : list()))
|
||||
if(clothes_req && !(spell && istype(spell)))//clothes check
|
||||
if(!istype(user, /mob/living/carbon/human))
|
||||
to_chat(user, "You aren't a human, Why are you trying to cast a human spell, silly non-human? Casting human spells is for humans.")
|
||||
@@ -134,6 +134,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
|
||||
|
||||
/obj/effect/proc_holder/spell/New()
|
||||
..()
|
||||
action = new(src)
|
||||
|
||||
still_recharging_msg = "<span class='notice'>[name] is still recharging.</span>"
|
||||
charge_counter = charge_max
|
||||
@@ -152,9 +153,13 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
|
||||
return
|
||||
|
||||
/obj/effect/proc_holder/spell/proc/start_recharge()
|
||||
if(action)
|
||||
action.UpdateButtonIcon()
|
||||
while(charge_counter < charge_max)
|
||||
sleep(1)
|
||||
charge_counter++
|
||||
if(action)
|
||||
action.UpdateButtonIcon()
|
||||
|
||||
/obj/effect/proc_holder/spell/proc/perform(list/targets, recharge = 1, mob/user = usr) //if recharge is started is important for the trigger spells
|
||||
before_cast(targets)
|
||||
@@ -355,7 +360,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
|
||||
return 1
|
||||
|
||||
/obj/effect/proc_holder/spell/proc/can_cast(mob/user = usr)
|
||||
if(((!user.mind) || !(src in user.mind.spell_list)) && !(src in user.spell_list))
|
||||
if(((!user.mind) || !(src in user.mind.spell_list)) && !(src in user.mob_spell_list))
|
||||
return 0
|
||||
|
||||
if(user.z == ZLEVEL_CENTCOMM && !centcom_cancast) //Certain spells are not allowed on the centcom zlevel
|
||||
@@ -381,7 +386,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
|
||||
if((invocation_type == "whisper" || invocation_type == "shout") && H.is_muzzled())
|
||||
return 0
|
||||
|
||||
var/obj/effect/proc_holder/spell/noclothes/clothcheck = locate() in user.spell_list
|
||||
var/obj/effect/proc_holder/spell/noclothes/clothcheck = locate() in user.mob_spell_list
|
||||
var/obj/effect/proc_holder/spell/noclothes/clothcheck2 = locate() in user.mind.spell_list
|
||||
if(clothes_req && !(clothcheck && istype(clothcheck)) && !(clothcheck2 && istype(clothcheck2)))//clothes check
|
||||
if(!istype(H.wear_suit, /obj/item/clothing/suit/wizrobe) && !istype(H.wear_suit, /obj/item/clothing/suit/space/rig/wizard))
|
||||
|
||||
@@ -20,8 +20,8 @@
|
||||
|
||||
if(L.pulling && (istype(L.pulling, /mob/living)))
|
||||
var/mob/living/M = L.pulling
|
||||
if(M.spell_list.len != 0 || (M.mind && M.mind.spell_list.len != 0))
|
||||
for(var/obj/effect/proc_holder/spell/S in M.spell_list)
|
||||
if(M.mob_spell_list.len != 0 || (M.mind && M.mind.spell_list.len != 0))
|
||||
for(var/obj/effect/proc_holder/spell/S in M.mob_spell_list)
|
||||
S.charge_counter = S.charge_max
|
||||
if(M.mind)
|
||||
for(var/obj/effect/proc_holder/spell/S in M.mind.spell_list)
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
name = "Genetic"
|
||||
desc = "This spell inflicts a set of mutations and disabilities upon the target."
|
||||
|
||||
var/sdisabilities = 0 //bits
|
||||
var/disabilities = 0 //bits
|
||||
var/list/mutations = list() //mutation strings
|
||||
var/duration = 100 //deciseconds
|
||||
/*
|
||||
@@ -22,14 +22,14 @@
|
||||
target.mutations.Add(x)
|
||||
/* if(x == HULK && ishuman(target))
|
||||
target:hulk_time=world.time + duration */
|
||||
target.sdisabilities |= sdisabilities
|
||||
target.disabilities |= disabilities
|
||||
target.update_mutations() //update target's mutation overlays
|
||||
var/mob/living/carbon/human/H = target
|
||||
if(ishuman(target))
|
||||
H.update_body()
|
||||
spawn(duration)
|
||||
target.mutations.Remove(mutations)
|
||||
target.sdisabilities &= ~sdisabilities
|
||||
target.disabilities &= ~disabilities
|
||||
target.update_mutations()
|
||||
if(ishuman(target))
|
||||
H.update_body()
|
||||
|
||||
@@ -19,19 +19,18 @@ Urist: I don't feel like figuring out how you store object spells so I'm leaving
|
||||
Make sure spells that are removed from spell_list are actually removed and deleted when mind transfering.
|
||||
Also, you never added distance checking after target is selected. I've went ahead and did that.
|
||||
*/
|
||||
/obj/effect/proc_holder/spell/targeted/mind_transfer/cast(list/targets,mob/user = usr)
|
||||
/obj/effect/proc_holder/spell/targeted/mind_transfer/cast(list/targets, mob/user = usr, distanceoverride)
|
||||
if(!targets.len)
|
||||
to_chat(user, "No mind found.")
|
||||
return
|
||||
|
||||
if(targets.len > 1)
|
||||
to_chat(user, "Too many minds! You're not a hive damnit!")//Whaa...aat?
|
||||
|
||||
return
|
||||
|
||||
var/mob/living/target = targets[1]
|
||||
|
||||
if(!(target in oview(range)))//If they are not in overview after selection. Do note that !() is necessary for in to work because ! takes precedence over it.
|
||||
if(!(target in oview(range)) && !distanceoverride)//If they are not in overview after selection. Do note that !() is necessary for in to work because ! takes precedence over it.
|
||||
to_chat(user, "They are too far away!")
|
||||
return
|
||||
|
||||
@@ -64,18 +63,16 @@ Also, you never added distance checking after target is selected. I've went ahea
|
||||
victim.verbs -= V
|
||||
|
||||
var/mob/dead/observer/ghost = victim.ghostize(0)
|
||||
ghost.spell_list = victim.spell_list//If they have spells, transfer them. Now we basically have a backup mob.
|
||||
|
||||
caster.mind.transfer_to(victim)
|
||||
victim.spell_list = caster.spell_list//Now they are inside the victim's body.
|
||||
|
||||
if(victim.mind.special_verbs.len)//To add all the special verbs for the original caster.
|
||||
for(var/V in caster.mind.special_verbs)//Not too important but could come into play.
|
||||
caster.verbs += V
|
||||
|
||||
ghost.mind.transfer_to(caster)
|
||||
caster.key = ghost.key //have to transfer the key since the mind was not active
|
||||
caster.spell_list = ghost.spell_list
|
||||
if(ghost.key)
|
||||
caster.key = ghost.key //have to transfer the key since the mind was not active
|
||||
qdel(ghost)
|
||||
|
||||
if(caster.mind.special_verbs.len)//If they had any special verbs, we add them here.
|
||||
for(var/V in caster.mind.special_verbs)
|
||||
|
||||
@@ -231,7 +231,7 @@
|
||||
amt_eye_blurry = 20
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/genetic/blind
|
||||
sdisabilities = BLIND
|
||||
disabilities = BLIND
|
||||
duration = 300
|
||||
|
||||
/obj/effect/proc_holder/spell/dumbfire/fireball
|
||||
|
||||
@@ -861,8 +861,8 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
|
||||
name = "Food Crate"
|
||||
contains = list(/obj/item/weapon/reagent_containers/food/condiment/flour,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/rice,
|
||||
/obj/item/weapon/reagent_containers/food/drinks/milk,
|
||||
/obj/item/weapon/reagent_containers/food/drinks/soymilk,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/milk,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/soymilk,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/saltshaker,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/peppermill,
|
||||
/obj/item/weapon/storage/fancy/egg_box,
|
||||
|
||||
+47
-14
@@ -412,6 +412,16 @@ var/list/uplink_items = list()
|
||||
item = /obj/item/weapon/melee/energy/sword/saber
|
||||
cost = 8
|
||||
|
||||
/datum/uplink_item/dangerous/powerfist
|
||||
name = "Power Fist"
|
||||
desc = "The power-fist is a metal gauntlet with a built-in piston-ram powered by an external gas supply.\
|
||||
Upon hitting a target, the piston-ram will extend foward to make contact for some serious damage. \
|
||||
Using a wrench on the piston valve will allow you to tweak the amount of gas used per punch to \
|
||||
deal extra damage and hit targets further. Use a screwdriver to take out any attached tanks."
|
||||
reference = "PF"
|
||||
item = /obj/item/weapon/melee/powerfist
|
||||
cost = 8
|
||||
|
||||
/datum/uplink_item/dangerous/chainsaw
|
||||
name = "Chainsaw"
|
||||
desc = "A high powered chainsaw for cutting up ...you know...."
|
||||
@@ -752,6 +762,13 @@ var/list/uplink_items = list()
|
||||
item = /obj/item/toy/carpplushie/dehy_carp
|
||||
cost = 3
|
||||
|
||||
/datum/uplink_item/stealthy_weapons/chamsechud
|
||||
name = "Chameleon Security HUD"
|
||||
desc = "A stolen Nanotrasen Security HUD with Syndicate chameleon technology implemented into it. Similarly to a chameleon jumpsuit, the HUD can be morphed into various other eyewear, while retaining the HUD qualities when worn."
|
||||
reference = "CHHUD"
|
||||
item = /obj/item/clothing/glasses/hud/security/chameleon
|
||||
cost = 2
|
||||
|
||||
// STEALTHY TOOLS
|
||||
|
||||
/datum/uplink_item/stealthy_tools
|
||||
@@ -885,33 +902,49 @@ var/list/uplink_items = list()
|
||||
cost = 9
|
||||
gamemodes = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/device_tools/space_suit
|
||||
name = "Space Suit"
|
||||
desc = "The red and black syndicate space suit is less encumbering than Nanotrasen variants, fits inside bags, and has a weapon slot. Nanotrasen crewmembers are trained to report red space suit sightings."
|
||||
//Space Suits and Hardsuits
|
||||
/datum/uplink_item/suits
|
||||
category = "Space Suits and Hardsuits"
|
||||
surplus = 40
|
||||
|
||||
/datum/uplink_item/suits/space_suit
|
||||
name = "Syndicate Space Suit"
|
||||
desc = "This red and black syndicate space suit is less encumbering than Nanotrasen variants, \
|
||||
fits inside bags, and has a weapon slot. Nanotrasen crewmembers are trained to report red space suit \
|
||||
sightings, however."
|
||||
reference = "SS"
|
||||
item = /obj/item/weapon/storage/box/syndie_kit/space
|
||||
cost = 4
|
||||
|
||||
/datum/uplink_item/device_tools/hardsuit
|
||||
name = "Blood-red Hardsuit"
|
||||
desc = "The feared suit of a syndicate nuclear agent. Features slightly better armor. When the helmet is deployed your identity will be protected. Toggling the suit into combat mode \
|
||||
will allow you all the mobility of a loose fitting uniform without sacrificing armor. Additionally the suit is collapsible, small enough to fit within a backpack. \
|
||||
Nanotrasen crewmembers are trained to report red space suit sightings, these suits in particular are known to drive employees into a panic."
|
||||
/datum/uplink_item/suits/hardsuit
|
||||
name = "Syndicate Hardsuit"
|
||||
desc = "The feared suit of a syndicate nuclear agent. Features slightly better armoring and a built in jetpack \
|
||||
that runs off standard atmospheric tanks. When the built in helmet is deployed your identity will be \
|
||||
protected, even in death, as the suit cannot be removed by outside forces. Toggling the suit in and out of \
|
||||
combat mode will allow you all the mobility of a loose fitting uniform without sacrificing armoring. \
|
||||
Additionally the suit is collapsible, making it small enough to fit within a backpack. \
|
||||
Nanotrasen crew who spot these suits are known to panic."
|
||||
reference = "BRHS"
|
||||
item = /obj/item/weapon/storage/box/syndie_kit/hardsuit
|
||||
cost = 8
|
||||
|
||||
/datum/uplink_item/device_tools/elite_hardsuit
|
||||
/datum/uplink_item/suits/hardsuit/elite
|
||||
name = "Elite Syndicate Hardsuit"
|
||||
desc = "The elite Syndicate hardsuit is worn by only the best nuclear agents. Features much better armoring and complete fireproofing. \
|
||||
When the built in helmet is deployed your identity will be protected. Toggling the suit into combat mode will allow you all the mobility \
|
||||
of a loose fitting uniform without sacrificing armoring. Additionally the suit is collapsible, small enough to fit within a backpack. \
|
||||
Nanotrasen crewmembers are trained to report red space suit sightings; these suits in particular are known to drive employees into a panic."
|
||||
reference = "ESHS"
|
||||
desc = "An advanced hardsuit with superior armor and mobility to the standard Syndicate Hardsuit."
|
||||
item = /obj/item/weapon/storage/box/syndie_kit/elite_hardsuit
|
||||
cost = 8
|
||||
reference = "ESHS"
|
||||
gamemodes = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/suits/hardsuit/shielded
|
||||
name = "Shielded Hardsuit"
|
||||
desc = "An advanced hardsuit with built in energy shielding. The shields will rapidly recharge when not under fire."
|
||||
item = /obj/item/weapon/storage/box/syndie_kit/shielded_hardsuit
|
||||
cost = 30
|
||||
reference = "SHS"
|
||||
gamemodes = list(/datum/game_mode/nuclear)
|
||||
|
||||
|
||||
/datum/uplink_item/device_tools/thermal
|
||||
name = "Thermal Imaging Glasses"
|
||||
desc = "These glasses are thermals disguised as engineers' optical meson scanners. They allow you to see organisms through walls by capturing the upper portion of the infra-red light spectrum, emitted as heat and light by objects. Hotter objects, such as warm bodies, cybernetic organisms and artificial intelligence cores emit more of this light than cooler objects like walls and airlocks."
|
||||
|
||||
Reference in New Issue
Block a user