diff --git a/code/modules/arcade/mob_hunt/game_server.dm b/code/modules/arcade/mob_hunt/game_server.dm index 18afd48171a..6ea8ef3f340 100644 --- a/code/modules/arcade/mob_hunt/game_server.dm +++ b/code/modules/arcade/mob_hunt/game_server.dm @@ -90,7 +90,7 @@ var/global/obj/machinery/mob_hunt_server/mob_hunt_server = null /obj/machinery/mob_hunt_server/proc/register_spawn(datum/mob_hunt/mob_info) if(!mob_info) return 0 - var/obj/effect/nanomob/new_mob = new /obj/effect/nanomob(locate(mob_info.x_coord, mob_info.y_coord, STATION_LEVEL), mob_info) + var/obj/effect/nanomob/new_mob = new /obj/effect/nanomob(get_turf(src), mob_info) normal_spawns += new_mob return 1 diff --git a/code/modules/arcade/mob_hunt/mob_avatar.dm b/code/modules/arcade/mob_hunt/mob_avatar.dm index e319a9de11b..7ed0a0a6f73 100644 --- a/code/modules/arcade/mob_hunt/mob_avatar.dm +++ b/code/modules/arcade/mob_hunt/mob_avatar.dm @@ -12,6 +12,7 @@ var/list/clients_encountered = list() //tracks who has already interacted with us, so they can't attempt a second capture /obj/effect/nanomob/New(loc, datum/mob_hunt/new_info) + ..() if(!new_info) qdel(src) return @@ -21,6 +22,9 @@ icon_state = mob_info.icon_state_shiny else icon_state = mob_info.icon_state_normal + var/turf/target_turf = locate(mob_info.x_coord, mob_info.y_coord, STATION_LEVEL) + forceMove(target_turf) + to_chat(world, "[name] located at ([x],[y],[z])") if(!mob_info.is_trap) addtimer(src, "despawn", mob_info.lifetime) @@ -43,6 +47,10 @@ return var/datum/data/pda/app/mob_hunter_game/client = P.current_app + if(!client.connected) //must be connected to attempt captures + for(var/mob/O in hearers(4, P.loc)) + O.show_message("[bicon(P)] No server connection. Capture aborted.") + return if(mob_info.is_trap) //traps work even if you ran into them before if(istype(P.loc, /mob/living/carbon)) @@ -84,4 +92,11 @@ mob_hunt_server.check_stability() else mob_hunt_server.normal_spawns -= src - qdel(src) \ No newline at end of file + qdel(src) + +/obj/effect/nanomob/proc/reveal() + if(invisibility == 101) + invisibility = 0 + spawn(30) + if(src) + invisibility = 101 diff --git a/code/modules/arcade/mob_hunt/mob_cards.dm b/code/modules/arcade/mob_hunt/mob_cards.dm index 1732238d926..9ab1d781d49 100644 --- a/code/modules/arcade/mob_hunt/mob_cards.dm +++ b/code/modules/arcade/mob_hunt/mob_cards.dm @@ -16,10 +16,10 @@ if(mob_data.is_shiny) name = "Holographic [mob_data.mob_name] Nano-Mob Hunter Card" desc = "WOW! A holographic trading card containing a level [mob_data.level] [mob_data.mob_name]!" + icon_state = "trade_card_holo" else name = "[mob_data.mob_name] Nano-Mob Hunter Card" desc = "A trading card containing a level [mob_data.level] [mob_data.mob_name]!" - icon_state = "trade_card_holo" //Booster Pack Cards (random mob data) /obj/item/weapon/nanomob_card/booster diff --git a/code/modules/arcade/mob_hunt/mob_datums.dm b/code/modules/arcade/mob_hunt/mob_datums.dm index 2bca5b0fdfd..58034198c21 100644 --- a/code/modules/arcade/mob_hunt/mob_datums.dm +++ b/code/modules/arcade/mob_hunt/mob_datums.dm @@ -57,7 +57,7 @@ health[2] = base_health + (level * health_multiplier) if(prob(1) && prob(1)) is_shiny = 1 - if(no_register) + if(no_register) //for booster pack cards return if(mob_hunt_server) if(set_trap) @@ -67,6 +67,8 @@ mob_hunt_server.register_trap(src) else if(select_spawn()) mob_hunt_server.register_spawn(src) + else //if we aren't a trap and can't spawn, delete the datum to avoid buildups + qdel(src) else qdel(src) @@ -82,31 +84,37 @@ log_admin("No possible areas to spawn [type] found. Possible code/mapping error?") return 0 var/list/possible_turfs = list() + var/turf/T while(possible_areas.len) //randomly select an area from our possible_areas list to try spawning in, then remove it from possible_areas so it won't get picked over and over forever. - var/spawn_area = pick(possible_areas) - possible_areas -= spawn_area + var/area/spawn_area = locate(pick_n_take(possible_areas)) + if(!spawn_area) + break //clear and generate a fresh list of turfs in the selected area, weighted based on white/black lists possible_turfs.Cut() - for(var/turf/T in spawn_area) + for(var/turf/PT in spawn_area) var/value = 1 - if(is_type_in_list(T, turf_whitelist)) //if whitelisted, we have a significant bonus to our weight + if(is_type_in_list(PT, turf_whitelist)) //if whitelisted, we have a significant bonus to our weight value += 2 - if(is_type_in_list(T, turf_blacklist)) //blacklisting only removes 1 value (weight), so whitelisted subtypes are still more likely than normal turfs + if(is_type_in_list(PT, turf_blacklist)) //blacklisting only removes 1 value (weight), so whitelisted subtypes are still more likely than normal turfs value -= 1 //but non-whitelisted turfs will be disqualified if(!value) continue - possible_turfs[T] = value + possible_turfs[PT] = value if(!possible_turfs.len) //If we don't have any possible turfs, this attempt was a failure. Try again. continue //if we got this far, we're spawning on this attempt, hooray! - var/turf/T = pickweight(possible_turfs) + T = pickweight(possible_turfs) x_coord = T.x y_coord = T.y - + break + if(T) + to_chat(world, "DEBUGGING: [type] spawning at ([x_coord], [y_coord])") + return 1 + else //if we get to this, we failed every attempt to find a suitable turf for EVERY area in our list of possible areas. DAMN. - log_admin("No acceptable turfs to spawn [type] on could be located. Possible code/mapping error, or someone replaced/destroyed all the acceptable turf types?") - return 0 + log_admin("No acceptable turfs to spawn [type] on could be located. Possible code/mapping error, or someone replaced/destroyed all the acceptable turf types?") + return 0 /datum/mob_hunt/proc/calc_dam_multiplier(datum/mob_type/attack_type) if(!primary_type) @@ -169,6 +177,19 @@ health[2] = base_health + (level * health_multiplier) message += "[nickname ? nickname : mob_name] has reached level [level]!" +/datum/mob_hunt/proc/get_type1() + if(!primary_type) + return "Typeless" + else + return initial(primary_type.name) + +/datum/mob_hunt/proc/get_type2() + if(!secondary_type) + return null + else + return initial(secondary_type.name) + + /datum/mob_hunt/nemabug mob_name = "Nemabug" run_chance = 50 diff --git a/code/modules/pda/PDA.dm b/code/modules/pda/PDA.dm index f25bbdff46e..0642ad64029 100755 --- a/code/modules/pda/PDA.dm +++ b/code/modules/pda/PDA.dm @@ -427,6 +427,9 @@ var/global/list/obj/item/device/pda/PDAs = list() user.drop_item() C.forceMove(src) to_chat(user, "You slide \the [C] into \the [src].") + else if(istype(C, /obj/item/weapon/nanomob_card)) + if(cartridge && istype(cartridge, /obj/item/weapon/cartridge/mob_hunt_game)) + cartridge.attackby(C, user, params) /obj/item/device/pda/attack(mob/living/C as mob, mob/living/user as mob) if(istype(C, /mob/living/carbon) && scanmode) diff --git a/code/modules/pda/cart.dm b/code/modules/pda/cart.dm index 46994348053..aa72770e72f 100644 --- a/code/modules/pda/cart.dm +++ b/code/modules/pda/cart.dm @@ -320,7 +320,7 @@ programs = list( new/datum/data/pda/app/mob_hunter_game) -/obj/item/weapon/cartridge/mob_hunt_game/attackby(obj/item/O, mob/user) +/obj/item/weapon/cartridge/mob_hunt_game/attackby(obj/item/O, mob/user, params) if(istype(O, /obj/item/weapon/nanomob_card)) var/obj/item/weapon/nanomob_card/card = O var/datum/data/pda/app/mob_hunter_game/my_game = programs[1] diff --git a/code/modules/pda/mob_hunt_game_app.dm b/code/modules/pda/mob_hunt_game_app.dm index 6f4f2669229..d0c02836207 100644 --- a/code/modules/pda/mob_hunt_game_app.dm +++ b/code/modules/pda/mob_hunt_game_app.dm @@ -13,6 +13,7 @@ var/list/my_collection = list() var/current_index = 0 + var/connected = 0 /datum/data/pda/app/mob_hunter_game/start() ..() @@ -23,30 +24,41 @@ processing_objects.Remove(pda) /datum/data/pda/app/mob_hunter_game/proc/scan_nearby() - if(!mob_hunt_server) + if(!mob_hunt_server || !connected) return + for(var/turf/T in range(3, get_turf(pda))) + for(var/obj/O in T.contents) + if(!istype(O, /obj/effect/nanomob)) + continue + var/obj/effect/nanomob/N = O + //reveal the mob + N.reveal() -/datum/data/pda/app/mob_hunter_game/proc/connect() - if(!mob_hunt_server || !mob_hunt_server.server_status) +/datum/data/pda/app/mob_hunter_game/proc/reconnect() + if(!mob_hunt_server || !mob_hunt_server.server_status || connected) //show a message about the server being unavailable (because it doesn't exist / didn't get set to the global var / is offline) return 0 mob_hunt_server.connected_clients += src + connected = 1 + if(pda) + for(var/mob/O in hearers(2, pda.loc)) + O.show_message("[bicon(pda)] Connection established. Capture all of the mobs, [pda.owner ? pda.owner : "hunter"]!") return 1 -/datum/data/pda/app/mob_hunter_game/proc/disconnect(reason_message = null) +/datum/data/pda/app/mob_hunter_game/proc/disconnect(reason = null) + if(!mob_hunt_server || !connected) + return mob_hunt_server.connected_clients -= src - //show a disconnect message if we were disconnected involuntarily (message argument provided) + connected = 0 + //show a disconnect message if we were disconnected involuntarily (reason argument provided) + if(pda && reason) + for(var/mob/O in hearers(2, pda.loc)) + O.show_message("[bicon(pda)] Disconnected from server. Reason: [reason].") /datum/data/pda/app/mob_hunter_game/program_process() - if(!mob_hunt_server) - return null - for(var/obj/effect/nanomob/N in range(3, pda.loc)) - //TO-DO: show the mob (ideally only to the holder of the PDA, but we'll settle for the t-ray magic of showing everyone for right now) - if(N.invisibility == 101) - N.invisibility = 0 - spawn(30) - if(N) - N.invisibility = 101 + if(!mob_hunt_server || !connected) + return + scan_nearby() /datum/data/pda/app/mob_hunter_game/proc/register_capture(datum/mob_hunt/captured) if(!captured) @@ -55,6 +67,11 @@ return 1 /datum/data/pda/app/mob_hunter_game/update_ui(mob/user as mob, list/data) + if(!mob_hunt_server || !(src in mob_hunt_server.connected_clients)) + data["connected"] = 0 + else + data["connected"] = 1 + data["not_collection"] = 0 if(!my_collection.len) data["no_collecton"] = 1 return @@ -70,8 +87,8 @@ "nickname" = mob_info.nickname, "real_name" = mob_info.mob_name, "level" = mob_info.level, - "type1" = mob_info.primary_type, - "type2" = mob_info.secondary_type, + "type1" = mob_info.get_type1(), + "type2" = mob_info.get_type2(), "sprite" = "[mob_info.icon_state_normal].png" ) if(mob_info.is_shiny) @@ -124,8 +141,8 @@ current_index-- if(current_index < 1) current_index = my_collection.len - if("Connect") - connect() + if("Reconnect") + reconnect() if("Disconnect") disconnect() if("Transfer") diff --git a/nano/templates/pda_mob_hunt.tmpl b/nano/templates/pda_mob_hunt.tmpl index f98a701f55f..83df635ab6a 100644 --- a/nano/templates/pda_mob_hunt.tmpl +++ b/nano/templates/pda_mob_hunt.tmpl @@ -1,9 +1,36 @@ -{{if data.no_collection}} -
-
My Collection:
+
+
+ + + + {{if data.connected}} + + + {{else}} + + + {{/if}} + +
+ Connection Status: + + Connected + + {{:helper.link('Disconnect', 'sign-out', {'choice': 'Disconnect'})}} + + No Connection + + {{:helper.link('Connect', 'sign-in', {'choice': 'Reconnect'})}} +
-
- Your collection is empty! Go capture some Nano-Mobs! +
+
+
My Collection:
+{{if data.no_collection}} +
+
+ Your collection is empty! Go capture some Nano-Mobs! +
{{else}}
@@ -32,4 +59,25 @@
+
+ + + + + + + + +
+ {{:helper.link('Previous Mob', 'arrow-left', {'choice': 'Prev'})}} + + {{:helper.link('Transfer Mob', 'exchange', {'choice': 'Transfer'})}} + + {{:helper.link('Rename Mob', 'pencil', {'choice': 'Rename'})}} + + {{:helper.link('Release Mob', 'tree', {'choice': 'Release'})}} + + {{:helper.link('Next Mob', 'arrow-right', {'choice': 'Next'})}} +
+
{{/if}} \ No newline at end of file