Adds dextrous guardian (#19254)

Added dextrous guardians to the code, able to hold and use items and store a single item within themselves.

Dextrous guardians do low damage on punches, have medium damage resist, and recalling or leashing will force them to drop any items in their hands.
This commit is contained in:
Joan Lung
2016-07-12 19:25:00 -04:00
committed by oranges
parent 7100277ca3
commit fe28096320
23 changed files with 351 additions and 169 deletions
+1 -1
View File
@@ -33,7 +33,7 @@
#define slot_s_store 17
#define slot_in_backpack 18
#define slot_legcuffed 19
#define slot_drone_storage 20
#define slot_generic_dextrous_storage 20
#define slots_amt 20 // Keep this up to date!
+4 -67
View File
@@ -1,42 +1,14 @@
/datum/hud/drone/New(mob/owner, ui_style = 'icons/mob/screen_midnight.dmi')
/datum/hud/dextrous/drone/New(mob/owner, ui_style = 'icons/mob/screen_midnight.dmi')
..()
var/obj/screen/using
var/obj/screen/inventory/inv_box
using = new /obj/screen/drop()
using.icon = ui_style
using.screen_loc = ui_drone_drop
static_inventory += using
pull_icon = new /obj/screen/pull()
pull_icon.icon = ui_style
pull_icon.update_icon(mymob)
pull_icon.screen_loc = ui_drone_pull
static_inventory += pull_icon
inv_box = new /obj/screen/inventory/hand()
inv_box.name = "right hand"
inv_box.icon = ui_style
inv_box.icon_state = "hand_r"
inv_box.screen_loc = ui_rhand
inv_box.slot_id = slot_r_hand
static_inventory += inv_box
inv_box = new /obj/screen/inventory/hand()
inv_box.name = "left hand"
inv_box.icon = ui_style
inv_box.icon_state = "hand_l"
inv_box.screen_loc = ui_lhand
inv_box.slot_id = slot_l_hand
static_inventory += inv_box
inv_box = new /obj/screen/inventory()
inv_box.name = "internal storage"
inv_box.icon = ui_style
inv_box.icon_state = "suit_storage"
// inv_box.icon_full = "template"
inv_box.screen_loc = ui_drone_storage
inv_box.slot_id = slot_drone_storage
inv_box.slot_id = slot_generic_dextrous_storage
static_inventory += inv_box
inv_box = new /obj/screen/inventory()
@@ -48,26 +20,6 @@
inv_box.slot_id = slot_head
static_inventory += inv_box
using = new /obj/screen/swap_hand()
using.icon = ui_style
using.icon_state = "swap_1_m"
using.screen_loc = ui_swaphand1
static_inventory += using
using = new /obj/screen/swap_hand()
using.icon = ui_style
using.icon_state = "swap_2"
using.screen_loc = ui_swaphand2
static_inventory += using
zone_select = new /obj/screen/zone_sel()
zone_select.icon = ui_style
zone_select.update_icon(mymob)
using = new /obj/screen/inventory/craft
using.icon = ui_style
static_inventory += using
for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory))
if(inv.slot_id)
inv.hud = src
@@ -75,7 +27,7 @@
inv.update_icon()
/datum/hud/drone/persistant_inventory_update()
/datum/hud/dextrous/drone/persistant_inventory_update()
if(!mymob)
return
var/mob/living/simple_animal/drone/D = mymob
@@ -93,19 +45,4 @@
if(D.head)
D.head.screen_loc = null
if(hud_version != HUD_STYLE_NOHUD)
if(D.r_hand)
D.r_hand.screen_loc = ui_rhand
D.client.screen += D.r_hand
if(D.l_hand)
D.l_hand.screen_loc = ui_lhand
D.client.screen += D.l_hand
else
if(D.r_hand)
D.r_hand.screen_loc = null
if(D.l_hand)
D.l_hand.screen_loc = null
/mob/living/simple_animal/drone/create_mob_hud()
if(client && !hud_used)
hud_used = new /datum/hud/drone(src, ui_style2icon(client.prefs.UI_style))
..()
+14
View File
@@ -9,6 +9,12 @@
using.screen_loc = ui_drone_drop
static_inventory += using
pull_icon = new /obj/screen/pull()
pull_icon.icon = ui_style
pull_icon.update_icon(mymob)
pull_icon.screen_loc = ui_drone_pull
static_inventory += pull_icon
inv_box = new /obj/screen/inventory/hand()
inv_box.name = "right hand"
inv_box.icon = ui_style
@@ -37,6 +43,14 @@
using.screen_loc = ui_swaphand2
static_inventory += using
zone_select = new /obj/screen/zone_sel()
zone_select.icon = ui_style
zone_select.update_icon(mymob)
using = new /obj/screen/inventory/craft
using.icon = ui_style
static_inventory += using
mymob.client.screen = list()
for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory))
+62 -1
View File
@@ -29,8 +29,69 @@
/mob/living/simple_animal/hostile/guardian/create_mob_hud()
if(client && !hud_used)
hud_used = new /datum/hud/guardian(src)
if(dextrous)
..()
else
hud_used = new /datum/hud/guardian(src, ui_style2icon(client.prefs.UI_style))
/datum/hud/dextrous/guardian/New(mob/living/simple_animal/hostile/guardian/owner, ui_style = 'icons/mob/screen_midnight.dmi') //for a dextrous guardian
..()
var/obj/screen/using
if(istype(owner, /mob/living/simple_animal/hostile/guardian/dextrous))
var/obj/screen/inventory/inv_box
inv_box = new /obj/screen/inventory()
inv_box.name = "internal storage"
inv_box.icon = ui_style
inv_box.icon_state = "suit_storage"
inv_box.screen_loc = ui_id
inv_box.slot_id = slot_generic_dextrous_storage
static_inventory += inv_box
using = new /obj/screen/guardian/Communicate()
using.screen_loc = ui_sstore1
static_inventory += using
else
using = new /obj/screen/guardian/Communicate()
using.screen_loc = ui_id
static_inventory += using
healths = new /obj/screen/healths/guardian()
infodisplay += healths
using = new /obj/screen/guardian/Manifest()
using.screen_loc = ui_belt
static_inventory += using
using = new /obj/screen/guardian/Recall()
using.screen_loc = ui_back
static_inventory += using
using = new owner.toggle_button_type()
using.screen_loc = ui_storage2
static_inventory += using
using = new /obj/screen/guardian/ToggleLight()
using.screen_loc = ui_inventory
static_inventory += using
/datum/hud/dextrous/guardian/persistant_inventory_update()
if(!mymob)
return
if(istype(mymob, /mob/living/simple_animal/hostile/guardian/dextrous))
var/mob/living/simple_animal/hostile/guardian/dextrous/D = mymob
if(hud_shown)
if(D.internal_storage)
D.internal_storage.screen_loc = ui_id
D.client.screen += D.internal_storage
else
if(D.internal_storage)
D.internal_storage.screen_loc = null
..()
/obj/screen/guardian
icon = 'icons/mob/guardian.dmi'
+2 -2
View File
@@ -172,8 +172,8 @@
/obj/item/toy/gun/afterattack(atom/target as mob|obj|turf|area, mob/user, flag)
if (flag)
return
if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
usr << "<span class='warning'>You don't have the dexterity to do this!</span>"
if (!user.IsAdvancedToolUser())
user << "<span class='warning'>You don't have the dexterity to do this!</span>"
return
src.add_fingerprint(user)
if (src.bullets < 1)
@@ -27,7 +27,7 @@
/obj/item/weapon/storage/MouseDrop(atom/over_object)
if(iscarbon(usr) || isdrone(usr)) //all the check for item manipulation are in other places, you can safely open any storages as anything and its not buggy, i checked
if(ismob(usr)) //all the check for item manipulation are in other places, you can safely open any storages as anything and its not buggy, i checked
var/mob/M = usr
if(!over_object)
@@ -32,15 +32,12 @@
switch(severity)
if(1)
qdel(src)
return
if(2)
if(prob(70))
deconstruct()
return
if(3)
if(prob(50))
deconstruct()
return
/obj/structure/chair/narsie_act()
if(prob(20))
@@ -71,7 +68,6 @@
..()
else
rotate()
return
/obj/structure/chair/proc/handle_rotation(direction)
handle_layer()
@@ -204,7 +200,7 @@
/obj/structure/chair/MouseDrop(over_object, src_location, over_location)
. = ..()
if(over_object == usr && Adjacent(usr))
if(!item_chair || !ishuman(usr) || has_buckled_mobs() || src.flags & NODECONSTRUCT)
if(!item_chair || !usr.can_hold_items() || has_buckled_mobs() || src.flags & NODECONSTRUCT)
return
if(usr.incapacitated())
usr << "<span class='warning'>You can't do that right now!</span>"
+3 -3
View File
@@ -114,16 +114,16 @@
else if(istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
//if they are holding or wearing a card that has access, that works
if(src.check_access(H.get_active_hand()) || src.check_access(H.wear_id))
if(check_access(H.get_active_hand()) || src.check_access(H.wear_id))
return 1
else if(istype(M, /mob/living/carbon/monkey) || istype(M, /mob/living/carbon/alien/humanoid))
var/mob/living/carbon/george = M
//they can only hold things :(
if(src.check_access(george.get_active_hand()))
if(check_access(george.get_active_hand()))
return 1
else if(isanimal(M))
var/mob/living/simple_animal/A = M
if(check_access(A.access_card))
if(check_access(A.get_active_hand()) || check_access(A.access_card))
return 1
return 0
+1 -1
View File
@@ -247,7 +247,7 @@
S.handle_item_insertion(src)
return 1
S = M.get_item_by_slot(slot_drone_storage) //else we put in whatever is in drone storage
S = M.get_item_by_slot(slot_generic_dextrous_storage) //else we put in whatever is in drone storage
if(istype(S) && S.can_be_inserted(src,1))
S.handle_item_insertion(src)
@@ -228,3 +228,5 @@ Des: Removes all infected images from the alien.
if(see_override)
see_invisible = see_override
/mob/living/carbon/alien/can_hold_items()
return has_fine_manipulation
@@ -1077,6 +1077,9 @@
/mob/living/carbon/human/is_literate()
return 1
/mob/living/carbon/human/can_hold_items()
return TRUE
/mob/living/carbon/human/update_gravity(has_gravity,override = 0)
override = dna.species.override_float
..()
@@ -47,6 +47,8 @@
hud_possible = list(DIAG_STAT_HUD, DIAG_HUD, ANTAG_HUD)
unique_name = TRUE
faction = list("silicon")
dextrous = TRUE
dextrous_hud_type = /datum/hud/dextrous/drone
var/staticChoice = "static"
var/list/staticChoices = list("static", "blank", "letter", "animal")
var/picked = FALSE //Have we picked our visual appearence (+ colour if applicable)
@@ -65,7 +67,6 @@
var/seeStatic = 1 //Whether we see static instead of mobs
var/visualAppearence = MAINTDRONE //What we appear as
var/hacked = 0 //If we have laws to destroy the station
var/datum/personal_crafting/handcrafting
/mob/living/simple_animal/drone/New()
. = ..()
@@ -76,7 +77,7 @@
if(default_storage)
var/obj/item/I = new default_storage(src)
equip_to_slot_or_del(I, slot_drone_storage)
equip_to_slot_or_del(I, slot_generic_dextrous_storage)
if(default_hatmask)
var/obj/item/I = new default_hatmask(src)
equip_to_slot_or_del(I, slot_head)
@@ -91,7 +92,6 @@
else
verbs -= /mob/living/simple_animal/drone/verb/toggle_statics
handcrafting = new()
var/datum/atom_hud/data/diagnostic/diag_hud = huds[DATA_HUD_DIAGNOSTIC]
diag_hud.add_to_hud(src)
@@ -109,9 +109,6 @@
else
holder.icon_state = "hudstat"
/mob/living/simple_animal/drone/OpenCraftingMenu()
handcrafting.ui_interact(src)
/mob/living/simple_animal/drone/Destroy()
qdel(access_card) //Otherwise it ends up on the floor!
return ..()
@@ -128,8 +125,6 @@
/mob/living/simple_animal/drone/death(gibbed)
..(gibbed)
drop_l_hand()
drop_r_hand()
if(internal_storage)
unEquip(internal_storage)
if(head)
@@ -197,17 +192,6 @@
msg += "*---------*</span>"
user << msg
/mob/living/simple_animal/drone/IsAdvancedToolUser()
return 1
/mob/living/simple_animal/drone/canUseTopic(atom/movable/M, be_close = 0)
if(incapacitated())
return 0
if(be_close && !in_range(M, src))
return 0
return 1
/mob/living/simple_animal/drone/assess_threat() //Secbots won't hunt maintenance drones.
return -10
@@ -6,42 +6,6 @@
//Drone hands
/mob/living/simple_animal/drone/activate_hand(selhand)
if(istext(selhand))
selhand = lowertext(selhand)
if(selhand == "right" || selhand == "r")
selhand = 0
if(selhand == "left" || selhand == "l")
selhand = 1
if(selhand != src.hand)
swap_hand()
else
mode()
/mob/living/simple_animal/drone/swap_hand()
var/obj/item/held_item = get_active_hand()
if(held_item)
if(istype(held_item, /obj/item/weapon/twohanded))
var/obj/item/weapon/twohanded/T = held_item
if(T.wielded == 1)
usr << "<span class='warning'>Your other hand is too busy holding the [T.name].</span>"
return
hand = !hand
if(hud_used && hud_used.inv_slots[slot_l_hand] && hud_used.inv_slots[slot_r_hand])
var/obj/screen/inventory/hand/H
H = hud_used.inv_slots[slot_l_hand]
H.update_icon()
H = hud_used.inv_slots[slot_r_hand]
H.update_icon()
/mob/living/simple_animal/drone/unEquip(obj/item/I, force)
if(..(I,force))
update_inv_hands()
@@ -63,7 +27,7 @@
if(!((I.slot_flags & SLOT_HEAD) || (I.slot_flags & SLOT_MASK)))
return 0
return 1
if(slot_drone_storage)
if(slot_generic_dextrous_storage)
if(internal_storage)
return 0
return 1
@@ -74,7 +38,7 @@
switch(slot_id)
if(slot_head)
return head
if(slot_drone_storage)
if(slot_generic_dextrous_storage)
return internal_storage
..()
@@ -103,7 +67,7 @@
if(slot_head)
head = I
update_inv_head()
if(slot_drone_storage)
if(slot_generic_dextrous_storage)
internal_storage = I
update_inv_internal_storage()
else
@@ -111,15 +75,8 @@
return
/mob/living/simple_animal/drone/stripPanelUnequip(obj/item/what, mob/who, where)
..(what, who, where, 1)
/mob/living/simple_animal/drone/stripPanelEquip(obj/item/what, mob/who, where)
..(what, who, where, 1)
/mob/living/simple_animal/drone/getBackSlot()
return slot_drone_storage
return slot_generic_dextrous_storage
/mob/living/simple_animal/drone/getBeltSlot()
return slot_drone_storage
return slot_generic_dextrous_storage
@@ -1,6 +1,9 @@
var/global/list/parasites = list() //all currently existing/living guardians
#define GUARDIAN_HANDS_LAYER 1
#define GUARDIAN_TOTAL_LAYERS 1
/mob/living/simple_animal/hostile/guardian
name = "Guardian Spirit"
real_name = "Guardian Spirit"
@@ -31,6 +34,8 @@ var/global/list/parasites = list() //all currently existing/living guardians
melee_damage_upper = 15
butcher_results = list(/obj/item/weapon/ectoplasm = 1)
AIStatus = AI_OFF
dextrous_hud_type = /datum/hud/dextrous/guardian //if we're set to dextrous, account for it.
var/list/guardian_overlays[GUARDIAN_TOTAL_LAYERS]
var/reset = 0 //if the summoner has reset the guardian already
var/cooldown = 0
var/mob/living/summoner
@@ -121,6 +126,7 @@ var/global/list/parasites = list() //all currently existing/living guardians
med_hud_set_status()
if(summoner)
if(summoner.stat == DEAD)
forceMove(summoner.loc)
src << "<span class='danger'>Your summoner has died!</span>"
visible_message("<span class='danger'><B>\The [src] dies along with its user!</B></span>")
summoner.visible_message("<span class='danger'><B>[summoner]'s body is completely consumed by the strain of sustaining [src]!</B></span>")
@@ -128,12 +134,12 @@ var/global/list/parasites = list() //all currently existing/living guardians
if(!summoner.unEquip(W))
qdel(W)
summoner.dust()
ghostize()
death(TRUE)
qdel(src)
else
src << "<span class='danger'>Your summoner has died!</span>"
visible_message("<span class='danger'><B>The [src] dies along with its user!</B></span>")
ghostize()
death(TRUE)
qdel(src)
snapback()
@@ -177,9 +183,12 @@ var/global/list/parasites = list() //all currently existing/living guardians
return 1
/mob/living/simple_animal/hostile/guardian/death()
drop_l_hand()
drop_r_hand()
..()
summoner << "<span class='danger'><B>Your [name] died somehow!</span></B>"
summoner.death()
if(summoner)
summoner << "<span class='danger'><B>Your [name] died somehow!</span></B>"
summoner.death()
/mob/living/simple_animal/hostile/guardian/update_health_hud()
if(summoner && hud_used && hud_used.healths)
@@ -221,6 +230,84 @@ var/global/list/parasites = list() //all currently existing/living guardians
ghostize()
qdel(src)
//HAND HANDLING
/mob/living/simple_animal/hostile/guardian/equip_to_slot(obj/item/I, slot)
if(!slot)
return FALSE
if(!istype(I))
return FALSE
. = TRUE
if(I == l_hand)
l_hand = null
else if(I == r_hand)
r_hand = null
update_inv_hands()
if(I.pulledby)
I.pulledby.stop_pulling()
I.screen_loc = null // will get moved if inventory is visible
I.loc = src
I.equipped(src, slot)
I.layer = ABOVE_HUD_LAYER
/mob/living/simple_animal/hostile/guardian/proc/apply_overlay(cache_index)
var/image/I = guardian_overlays[cache_index]
if(I)
add_overlay(I)
/mob/living/simple_animal/hostile/guardian/proc/remove_overlay(cache_index)
if(guardian_overlays[cache_index])
overlays -= guardian_overlays[cache_index]
guardian_overlays[cache_index] = null
/mob/living/simple_animal/hostile/guardian/proc/update_inv_hands()
remove_overlay(GUARDIAN_HANDS_LAYER)
var/list/hands_overlays = list()
if(r_hand)
var/r_state = r_hand.item_state
if(!r_state)
r_state = r_hand.icon_state
var/image/r_hand_image = r_hand.build_worn_icon(state = r_state, default_layer = GUARDIAN_HANDS_LAYER, default_icon_file = r_hand.righthand_file, isinhands = TRUE)
hands_overlays += r_hand_image
if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD)
r_hand.layer = ABOVE_HUD_LAYER
r_hand.screen_loc = ui_rhand
client.screen |= r_hand
if(l_hand)
var/l_state = l_hand.item_state
if(!l_state)
l_state = l_hand.icon_state
var/image/l_hand_image = l_hand.build_worn_icon(state = l_state, default_layer = GUARDIAN_HANDS_LAYER, default_icon_file = l_hand.lefthand_file, isinhands = TRUE)
hands_overlays += l_hand_image
if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD)
l_hand.layer = ABOVE_HUD_LAYER
l_hand.screen_loc = ui_lhand
client.screen |= l_hand
if(hands_overlays.len)
guardian_overlays[GUARDIAN_HANDS_LAYER] = hands_overlays
apply_overlay(GUARDIAN_HANDS_LAYER)
/mob/living/simple_animal/hostile/guardian/update_inv_l_hand()
update_inv_hands()
/mob/living/simple_animal/hostile/guardian/update_inv_r_hand()
update_inv_hands()
/mob/living/simple_animal/hostile/guardian/regenerate_icons()
update_inv_hands()
//MANIFEST, RECALL, TOGGLE MODE/LIGHT, SHOW TYPE
/mob/living/simple_animal/hostile/guardian/proc/Manifest()
@@ -380,7 +467,7 @@ var/global/list/parasites = list() //all currently existing/living guardians
var/used_message = "<span class='holoparasite'>All the cards seem to be blank now.</span>"
var/failure_message = "<span class='holoparasitebold'>..And draw a card! It's...blank? Maybe you should try again later.</span>"
var/ling_failure = "<span class='holoparasitebold'>The deck refuses to respond to a souless creature such as you.</span>"
var/list/possible_guardians = list("Chaos", "Standard", "Ranged", "Support", "Explosive", "Lightning", "Protector", "Charger", "Assassin")
var/list/possible_guardians = list("Assassin", "Chaos", "Charger", "Explosive", "Lightning", "Protector", "Ranged", "Standard", "Support")
var/random = TRUE
var/allowmultiple = 0
var/allowling = 1
@@ -449,6 +536,9 @@ var/global/list/parasites = list() //all currently existing/living guardians
if("Assassin")
pickedtype = /mob/living/simple_animal/hostile/guardian/assassin
if("Dextrous")
pickedtype = /mob/living/simple_animal/hostile/guardian/dextrous
var/list/guardians = user.hasparasites()
if(guardians.len && !allowmultiple)
user << "<span class='holoparasite'>You already have a [mob_name]!</span>" //nice try, bucko
@@ -493,6 +583,9 @@ var/global/list/parasites = list() //all currently existing/living guardians
/obj/item/weapon/guardiancreator/tech/choose
random = FALSE
/obj/item/weapon/guardiancreator/tech/choose/dextrous
possible_guardians = list("Assassin", "Chaos", "Charger", "Dextrous", "Explosive", "Lightning", "Protector", "Ranged", "Standard", "Support")
/obj/item/weapon/paper/guardian
name = "Holoparasite Guide"
icon_state = "paper_words"
@@ -0,0 +1,108 @@
//Dextrous
/mob/living/simple_animal/hostile/guardian/dextrous
melee_damage_lower = 10
melee_damage_upper = 10
damage_coeff = list(BRUTE = 0.75, BURN = 0.75, TOX = 0.75, CLONE = 0.75, STAMINA = 0, OXY = 0.75)
playstyle_string = "<span class='holoparasite'>As a <b>dextrous</b> type you can hold items, store an item within yourself, and have medium damage resistance, but do low damage on attacks. Recalling and leashing will force you to drop unstored items!</span>"
magic_fluff_string = "<span class='holoparasite'>..And draw the Drone, a dextrous master of construction and repair.</span>"
tech_fluff_string = "<span class='holoparasite'>Boot sequence complete. Dextrous combat modules loaded. Holoparasite swarm online.</span>"
carp_fluff_string = "<span class='holoparasite'>CARP CARP CARP! You caught one! It can hold stuff in its fins, sort of.</span>"
dextrous = 1
environment_target_typecache = list(
/obj/machinery/door/window,
/obj/structure/window,
/obj/structure/closet,
/obj/structure/table,
/obj/structure/grille,
/obj/structure/rack,
/obj/structure/barricade,
/obj/machinery/camera) //so we can also attack cameras
var/obj/item/internal_storage //what we're storing within ourself
/mob/living/simple_animal/hostile/guardian/dextrous/death(gibbed)
..()
if(internal_storage)
unEquip(internal_storage)
/mob/living/simple_animal/hostile/guardian/dextrous/examine(mob/user)
if(dextrous)
var/msg = "<span class='info'>*---------*\nThis is \icon[src] \a <b>[src]</b>!\n"
msg += "[desc]\n"
if(l_hand && !(l_hand.flags&ABSTRACT))
if(l_hand.blood_DNA)
msg += "<span class='warning'>It is holding \icon[l_hand] [l_hand.gender==PLURAL?"some":"a"] blood-stained [l_hand.name] in its left hand!</span>\n"
else
msg += "It is holding \icon[l_hand] \a [l_hand] in its left hand.\n"
if(r_hand && !(r_hand.flags&ABSTRACT))
if(r_hand.blood_DNA)
msg += "<span class='warning'>It is holding \icon[r_hand] [r_hand.gender==PLURAL?"some":"a"] blood-stained [r_hand.name] in its right hand!</span>\n"
else
msg += "It is holding \icon[r_hand] \a [r_hand] in its right hand.\n"
if(internal_storage && !(internal_storage.flags&ABSTRACT))
if(internal_storage.blood_DNA)
msg += "<span class='warning'>It is holding \icon[internal_storage] [internal_storage.gender==PLURAL?"some":"a"] blood-stained [internal_storage.name] in its internal storage!</span>\n"
else
msg += "It is holding \icon[internal_storage] \a [internal_storage] in its internal storage.\n"
msg += "*---------*</span>"
user << msg
else
..()
/mob/living/simple_animal/hostile/guardian/dextrous/Recall()
if(loc == summoner || cooldown > world.time)
return 0
drop_l_hand()
drop_r_hand()
return ..() //lose items, then return
/mob/living/simple_animal/hostile/guardian/dextrous/snapback()
if(summoner && !(get_dist(get_turf(summoner),get_turf(src)) <= range))
drop_l_hand()
drop_r_hand()
..() //lose items, then return
//SLOT HANDLING BULLSHIT FOR INTERNAL STORAGE
/mob/living/simple_animal/hostile/guardian/dextrous/unEquip(obj/item/I, force)
if(..(I,force))
update_inv_hands()
if(I == internal_storage)
internal_storage = null
update_inv_internal_storage()
return 1
return 0
/mob/living/simple_animal/hostile/guardian/dextrous/can_equip(obj/item/I, slot)
switch(slot)
if(slot_generic_dextrous_storage)
if(internal_storage)
return 0
return 1
..()
/mob/living/simple_animal/hostile/guardian/dextrous/equip_to_slot(obj/item/I, slot)
if(!..())
return
switch(slot)
if(slot_generic_dextrous_storage)
internal_storage = I
update_inv_internal_storage()
else
src << "<span class='danger'>You are trying to equip this item to an unsupported inventory slot. Report this to a coder!</span>"
/mob/living/simple_animal/hostile/guardian/dextrous/getBackSlot()
return slot_generic_dextrous_storage
/mob/living/simple_animal/hostile/guardian/dextrous/getBeltSlot()
return slot_generic_dextrous_storage
/mob/living/simple_animal/hostile/guardian/dextrous/proc/update_inv_internal_storage()
if(internal_storage && client && hud_used && hud_used.hud_shown)
internal_storage.screen_loc = ui_id
client.screen += internal_storage
/mob/living/simple_animal/hostile/guardian/dextrous/regenerate_icons()
..()
update_inv_internal_storage()
@@ -234,7 +234,7 @@
/mob/living/simple_animal/hostile/UnarmedAttack(atom/A)
target = A
if(dextrous)
if(dextrous && !is_type_in_typecache(A, environment_target_typecache) && !ismob(A))
..()
else
AttackingTarget()
@@ -78,10 +78,13 @@
var/attacked_sound = "punch" //Played when someone punches the creature
var/dextrous = FALSE //If the creature has, and can use, hands
var/dextrous_hud_type = /datum/hud/dextrous
var/datum/personal_crafting/handcrafting
/mob/living/simple_animal/New()
..()
handcrafting = new()
verbs -= /mob/verb/observe
if(!real_name)
real_name = name
@@ -509,16 +512,25 @@
return 1
return 0
/mob/living/simple_animal/stripPanelUnequip(obj/item/what, mob/who, where, child_override)
if(!child_override)
/mob/living/simple_animal/canUseTopic(atom/movable/M, be_close = 0, no_dextery = 0)
if(incapacitated())
return 0
if(no_dextery || dextrous)
if(be_close && !in_range(M, src))
return 0
else
src << "<span class='warning'>You don't have the dexterity to do this!</span>"
return 0
return 1
/mob/living/simple_animal/stripPanelUnequip(obj/item/what, mob/who, where)
if(!canUseTopic(who, TRUE))
return
else
..()
/mob/living/simple_animal/stripPanelEquip(obj/item/what, mob/who, where, child_override)
if(!child_override)
src << "<span class='warning'>You don't have the dexterity to do this!</span>"
/mob/living/simple_animal/stripPanelEquip(obj/item/what, mob/who, where)
if(!canUseTopic(who, TRUE))
return
else
..()
@@ -584,7 +596,17 @@
//Dextrous simple mobs can use hands!
/mob/living/simple_animal/create_mob_hud()
if(client && !hud_used && dextrous)
hud_used = new /datum/hud/dextrous(src, ui_style2icon(client.prefs.UI_style))
hud_used = new dextrous_hud_type(src, ui_style2icon(client.prefs.UI_style))
/mob/living/simple_animal/OpenCraftingMenu()
if(dextrous)
handcrafting.ui_interact(src)
/mob/living/simple_animal/can_hold_items()
return dextrous
/mob/living/simple_animal/IsAdvancedToolUser()
return dextrous
/mob/living/simple_animal/activate_hand(selhand)
if(!dextrous)
+4 -1
View File
@@ -242,7 +242,7 @@ var/next_mob_id = 0
slot_ears, slot_glasses,\
slot_belt, slot_s_store,\
slot_l_store, slot_r_store,\
slot_drone_storage\
slot_generic_dextrous_storage\
)
for(var/slot in slot_priority)
@@ -938,5 +938,8 @@ var/next_mob_id = 0
/mob/proc/is_literate()
return 0
/mob/proc/can_hold_items()
return FALSE
/mob/proc/get_idcard()
return
+1 -1
View File
@@ -151,7 +151,7 @@
temp_img = icon("icons/ass/assfemale.png")
else //In case anyone ever makes the generic ass. For now I'll be using male asses.
temp_img = icon("icons/ass/assmale.png")
else if(isdrone (ass) || istype(ass,/mob/living/simple_animal/drone)) //Drones are hot
else if(isdrone(ass)) //Drones are hot
temp_img = icon("icons/ass/assdrone.png")
else
break
@@ -236,7 +236,7 @@
slot_ears, slot_glasses,\
slot_belt, slot_s_store,\
slot_l_store, slot_r_store,\
slot_drone_storage
slot_generic_dextrous_storage
)
/obj/item/weapon/reagent_containers/glass/bucket/attackby(obj/O, mob/user, params)
@@ -43,10 +43,11 @@ var/datum/events/keycard_events = new()
/obj/machinery/keycard_auth/ui_status(mob/user)
if(isanimal(user))
user << "<span class='warning'>You are too primitive to use this device!</span>"
else
return ..()
return UI_CLOSE
var/mob/living/simple_animal/A = user
if(!A.dextrous)
user << "<span class='warning'>You are too primitive to use this device!</span>"
return UI_CLOSE
return ..()
/obj/machinery/keycard_auth/ui_act(action, params)
if(..() || waiting || !allowed(usr))
+2 -2
View File
@@ -47,10 +47,10 @@
return UI_INTERACTIVE
return UI_CLOSE
/mob/living/simple_animal/drone/default_can_use_topic(src_object)
/mob/living/simple_animal/default_can_use_topic(src_object)
. = shared_ui_interaction(src_object)
if(. > UI_CLOSE)
. = min(., shared_living_ui_distance(src_object)) // Drones can only use things they're near.
. = min(., shared_living_ui_distance(src_object)) //simple animals can only use things they're near.
/mob/living/silicon/pai/default_can_use_topic(src_object)
// pAIs can only use themselves and the owner's radio.
+1
View File
@@ -1452,6 +1452,7 @@
#include "code\modules\mob\living\simple_animal\guardian\guardiannaming.dm"
#include "code\modules\mob\living\simple_animal\guardian\types\assassin.dm"
#include "code\modules\mob\living\simple_animal\guardian\types\charger.dm"
#include "code\modules\mob\living\simple_animal\guardian\types\dextrous.dm"
#include "code\modules\mob\living\simple_animal\guardian\types\explosive.dm"
#include "code\modules\mob\living\simple_animal\guardian\types\fire.dm"
#include "code\modules\mob\living\simple_animal\guardian\types\lightning.dm"