Adds a Horizon roundstart report with overmap bearings, sensor tweaks. (#15765)

This commit is contained in:
Matt Atlas
2023-02-14 22:52:47 +01:00
committed by GitHub
parent 745ab328e6
commit 4a0466972d
18 changed files with 196 additions and 24 deletions

View File

@@ -176,3 +176,9 @@ var/datum/controller/subsystem/shuttle/SSshuttle
/datum/controller/subsystem/shuttle/stat_entry() /datum/controller/subsystem/shuttle/stat_entry()
..("Shuttles:[shuttles.len], Ships:[ships.len], L:[registered_shuttle_landmarks.len][overmap_halted ? ", HALT" : ""]") ..("Shuttles:[shuttles.len], Ships:[ships.len], L:[registered_shuttle_landmarks.len][overmap_halted ? ", HALT" : ""]")
/datum/controller/subsystem/shuttle/proc/ship_by_type(type)
for (var/obj/effect/overmap/visitable/ship/ship in ships)
if (ship.type == type)
return ship
return null

View File

@@ -29,8 +29,8 @@ var/global/list/additional_antag_types = list()
var/station_was_nuked = 0 // See nuclearbomb.dm and malfunction.dm. var/station_was_nuked = 0 // See nuclearbomb.dm and malfunction.dm.
var/explosion_in_progress = 0 // Sit back and relax var/explosion_in_progress = 0 // Sit back and relax
var/waittime_l = 600 // Lower bound on time before intercept arrives (in tenths of seconds) var/waittime_l = 60 SECONDS // Lower bound on time before intercept arrives (in tenths of seconds)
var/waittime_h = 1800 // Upper bound on time before intercept arrives (in tenths of seconds) var/waittime_h = 180 SECONDS // Upper bound on time before intercept arrives (in tenths of seconds)
var/event_delay_mod_moderate // Modifies the timing of random events. var/event_delay_mod_moderate // Modifies the timing of random events.
var/event_delay_mod_major // As above. var/event_delay_mod_major // As above.
@@ -277,6 +277,9 @@ var/global/list/additional_antag_types = list()
spawn (ROUNDSTART_LOGOUT_REPORT_TIME) spawn (ROUNDSTART_LOGOUT_REPORT_TIME)
display_logout_report() display_logout_report()
var/welcome_delay = rand(waittime_l, waittime_h)
addtimer(CALLBACK(current_map, TYPE_PROC_REF(/datum/map, send_welcome)), welcome_delay)
//Assign all antag types for this game mode. Any players spawned as antags earlier should have been removed from the pending list, so no need to worry about those. //Assign all antag types for this game mode. Any players spawned as antags earlier should have been removed from the pending list, so no need to worry about those.
for(var/datum/antagonist/antag in antag_templates) for(var/datum/antagonist/antag in antag_templates)
if(!(antag.flags & ANTAG_OVERRIDE_JOB)) if(!(antag.flags & ANTAG_OVERRIDE_JOB))

View File

@@ -61,6 +61,12 @@
sector_hud_menu_sound = 'sound/effects/tajara_menu_click.ogg' sector_hud_menu_sound = 'sound/effects/tajara_menu_click.ogg'
sector_hud_arrow = "menu_arrow" sector_hud_arrow = "menu_arrow"
/datum/space_sector/srandmarr/get_port_travel_time()
return "[rand(6, 12)] hours"
/datum/space_sector/srandmarr/generate_system_name()
return "S'rand'marr, and nearby points of interest"
/datum/space_sector/nrrahrahul /datum/space_sector/nrrahrahul
name = SECTOR_NRRAHRAHUL name = SECTOR_NRRAHRAHUL
description = "Hro'zamal is the second planet in the Nrrahrahul system. Formerly named Nrrahrahul Two, it was given the name Hro'zamal after the establishment of a permanent civilian \ description = "Hro'zamal is the second planet in the Nrrahrahul system. Formerly named Nrrahrahul Two, it was given the name Hro'zamal after the establishment of a permanent civilian \

View File

@@ -110,3 +110,9 @@
/datum/space_sector/proc/get_chat_description() /datum/space_sector/proc/get_chat_description()
return "<hr><div align='center'><hr1><B>Current Sector: [name]!</B></hr1><br><i>[description]</i><hr></div>" return "<hr><div align='center'><hr1><B>Current Sector: [name]!</B></hr1><br><i>[description]</i><hr></div>"
/datum/space_sector/proc/get_port_travel_time()
return "[rand(1, 3)] days"
/datum/space_sector/proc/generate_system_name()
return "[pick("Miranda", "BNM", "Xavier", "GJ", "HD", "TC", "Melissa", "TC")][prob(10) ? " Eridani" : ""] [rand(100,999)][prob(10) ? " [pick(greek_letters)]" : ""]"

View File

@@ -95,6 +95,7 @@
if(looping_sound) if(looping_sound)
soundloop = new(src, enabled) soundloop = new(src, enabled)
initial_name = name initial_name = name
listener = new(LISTENER_MODULAR_COMPUTER, src)
/obj/item/modular_computer/Destroy() /obj/item/modular_computer/Destroy()
kill_program(TRUE) kill_program(TRUE)
@@ -105,6 +106,7 @@
qdel(CH) qdel(CH)
STOP_PROCESSING(SSprocessing, src) STOP_PROCESSING(SSprocessing, src)
QDEL_NULL(soundloop) QDEL_NULL(soundloop)
QDEL_NULL(listener)
return ..() return ..()
/obj/item/modular_computer/CouldUseTopic(var/mob/user) /obj/item/modular_computer/CouldUseTopic(var/mob/user)

View File

@@ -79,6 +79,7 @@
var/obj/item/computer_hardware/tesla_link/tesla_link // Tesla Link, Allows remote charging from nearest APC. var/obj/item/computer_hardware/tesla_link/tesla_link // Tesla Link, Allows remote charging from nearest APC.
var/obj/item/device/paicard/personal_ai // Personal AI, can control the device via a verb when installed var/obj/item/device/paicard/personal_ai // Personal AI, can control the device via a verb when installed
var/obj/item/computer_hardware/flashlight/flashlight var/obj/item/computer_hardware/flashlight/flashlight
var/listener/listener
var/registered_message = "" var/registered_message = ""

View File

@@ -198,7 +198,7 @@
new /datum/computer_file/program/chat_client(comp), new /datum/computer_file/program/chat_client(comp),
new /datum/computer_file/program/civilian/cargoorder(comp), new /datum/computer_file/program/civilian/cargoorder(comp),
new /datum/computer_file/program/card_mod(comp), new /datum/computer_file/program/card_mod(comp),
new /datum/computer_file/program/comm(comp, FALSE), new /datum/computer_file/program/comm(comp, TRUE),
new /datum/computer_file/program/records/employment(comp) new /datum/computer_file/program/records/employment(comp)
) )
return _prg_list return _prg_list
@@ -279,7 +279,7 @@
new /datum/computer_file/program/manifest(comp), new /datum/computer_file/program/manifest(comp),
new /datum/computer_file/program/chat_client(comp), new /datum/computer_file/program/chat_client(comp),
new /datum/computer_file/program/card_mod(comp), new /datum/computer_file/program/card_mod(comp),
new /datum/computer_file/program/comm(comp, FALSE), new /datum/computer_file/program/comm(comp, TRUE),
new /datum/computer_file/program/camera_monitor(comp), new /datum/computer_file/program/camera_monitor(comp),
new /datum/computer_file/program/digitalwarrant(comp), new /datum/computer_file/program/digitalwarrant(comp),
new /datum/computer_file/program/penal_mechs(comp), new /datum/computer_file/program/penal_mechs(comp),

View File

@@ -81,12 +81,12 @@
// Handle datalinked view // Handle datalinked view
datalink_process() datalink_process()
for(var/obj/effect/overmap/contact in view(sensor_range, linked)) for(var/obj/effect/overmap/contact in view(sensor_range, linked))
if(contact == linked) if(contact == linked)
continue continue
if(!contact.requires_contact) // Only some effects require contact for visibility. if(!contact.requires_contact) // Only some effects require contact for visibility.
continue continue
objects_in_current_view[contact] = TRUE objects_in_current_view[contact] = TRUE
if(contact.instant_contact) // Instantly identify the object in range. if(contact.instant_contact) // Instantly identify the object in range.
@@ -94,6 +94,22 @@
else if(!(contact in objects_in_view)) else if(!(contact in objects_in_view))
objects_in_view[contact] = 0 objects_in_view[contact] = 0
if(sensors.deep_scan_toggled)
for(var/obj/effect/overmap/contact in range(sensors.deep_scan_range, linked))
if(!contact.sensor_range_override)
continue
if(contact == linked)
continue
if(!contact.requires_contact) // Only some effects require contact for visibility.
continue
objects_in_current_view[contact] = TRUE
if(contact.instant_contact) // Instantly identify the object in range.
objects_in_view[contact] = 100
else if(!(contact in objects_in_view))
objects_in_view[contact] = 0
for(var/obj/effect/overmap/contact in objects_in_view) //Update everything. for(var/obj/effect/overmap/contact in objects_in_view) //Update everything.
// Are we already aware of this object? // Are we already aware of this object?
@@ -279,7 +295,7 @@
// Recurse the function on the other ship's instance // Recurse the function on the other ship's instance
sensor_console.datalink_remove_ship_datalink(src.connected) sensor_console.datalink_remove_ship_datalink(src.connected)
visible_message(SPAN_NOTICE("<b>\The [src]</b> states, \"A datalink contact was sewered! Recalibration...\"")) visible_message(SPAN_NOTICE("<b>\The [src]</b> states, \"A datalink contact was severed! Recalibrating...\""))
/obj/machinery/computer/ship/sensors/proc/datalink_remove_all_ships_datalink() /obj/machinery/computer/ship/sensors/proc/datalink_remove_all_ships_datalink()

View File

@@ -11,6 +11,7 @@
var/unknown_id // A unique identifier used when this entity is scanned. Assigned in Initialize(). var/unknown_id // A unique identifier used when this entity is scanned. Assigned in Initialize().
var/requires_contact = TRUE //whether or not the effect must be identified by ship sensors before being seen. var/requires_contact = TRUE //whether or not the effect must be identified by ship sensors before being seen.
var/instant_contact = FALSE //do we instantly identify ourselves to any ship in sensors range? var/instant_contact = FALSE //do we instantly identify ourselves to any ship in sensors range?
var/sensor_range_override = FALSE //When true, this overmap object will be scanned with range instead of view.
var/sensor_visibility = 10 //how likely it is to increase identification process each scan. var/sensor_visibility = 10 //how likely it is to increase identification process each scan.
var/vessel_mass = 10000 // metric tonnes, very rough number, affects acceleration provided by engines var/vessel_mass = 10000 // metric tonnes, very rough number, affects acceleration provided by engines

View File

@@ -6,6 +6,7 @@ var/global/area/overmap/map_overmap // Global object used to locate the overmap
/obj/effect/overmap/visitable /obj/effect/overmap/visitable
name = "map object" name = "map object"
scannable = TRUE scannable = TRUE
sensor_range_override = TRUE
var/designation //Actual name of the object. var/designation //Actual name of the object.
var/class //Imagine a ship or station's class. "NTCC" Odin, "SCCV" Horizon, ... var/class //Imagine a ship or station's class. "NTCC" Odin, "SCCV" Horizon, ...
unknown_id = "Bogey" unknown_id = "Bogey"
@@ -51,6 +52,7 @@ var/global/area/overmap/map_overmap // Global object used to locate the overmap
var/list/place_near_main var/list/place_near_main
var/invisible_until_ghostrole_spawn = FALSE var/invisible_until_ghostrole_spawn = FALSE
var/hide_from_reports = FALSE
/obj/effect/overmap/visitable/Initialize() /obj/effect/overmap/visitable/Initialize()
. = ..() . = ..()

View File

@@ -66,6 +66,9 @@
data["range"] = sensors.range data["range"] = sensors.range
data["health"] = sensors.health data["health"] = sensors.health
data["max_health"] = sensors.max_health data["max_health"] = sensors.max_health
data["deep_scan_name"] = sensors.deep_scan_sensor_name
data["deep_scan_range"] = sensors.deep_scan_range
data["deep_scan_toggled"] = sensors.deep_scan_toggled
data["heat"] = sensors.heat data["heat"] = sensors.heat
data["critical_heat"] = sensors.critical_heat data["critical_heat"] = sensors.critical_heat
if(sensors.health == 0) if(sensors.health == 0)
@@ -96,7 +99,7 @@
var/list/contacts = list() var/list/contacts = list()
var/list/potential_contacts = list() var/list/potential_contacts = list()
for(var/obj/effect/overmap/nearby in view(7,linked)) for(var/obj/effect/overmap/nearby in view(7, linked))
if(nearby.requires_contact) // Some ships require. if(nearby.requires_contact) // Some ships require.
continue continue
potential_contacts |= nearby potential_contacts |= nearby
@@ -194,6 +197,10 @@
sensors.toggle() sensors.toggle()
return TOPIC_REFRESH return TOPIC_REFRESH
if(href_list["deep_scan_toggle"])
sensors.deep_scan_toggled = !sensors.deep_scan_toggled
return TOPIC_REFRESH
if(identification) if(identification)
if(href_list["toggle_id"]) if(href_list["toggle_id"])
identification.toggle() identification.toggle()
@@ -303,6 +310,9 @@
var/range = 1 var/range = 1
var/max_range = 10 var/max_range = 10
var/sensor_strength = 5//used for detecting ships via contacts var/sensor_strength = 5//used for detecting ships via contacts
var/deep_scan_range = 4 //Maximum range for the range() check in sensors. Basically a way to use range instead of view in this radius.
var/deep_scan_toggled = FALSE //When TRUE, this sensor is using long range sensors.
var/deep_scan_sensor_name = "High-Power Sensor Array"
idle_power_usage = 5000 idle_power_usage = 5000
var/base_icon_state var/base_icon_state
@@ -401,7 +411,9 @@
take_damage(rand(10,50)) take_damage(rand(10,50))
toggle() toggle()
heat += active_power_usage/15000 heat += active_power_usage / 15000
if(deep_scan_toggled)
heat += deep_scan_range / 8
if (heat > 0) if (heat > 0)
heat = max(0, heat - heat_reduction) heat = max(0, heat - heat_reduction)
@@ -433,10 +445,18 @@
heat_reduction = 1.7 // Can sustain range 4 heat_reduction = 1.7 // Can sustain range 4
max_range = 7 max_range = 7
desc = "Miniturized gravity scanner with various other sensors, used to detect irregularities in surrounding space. Can only run in vacuum to protect delicate quantum BS elements." desc = "Miniturized gravity scanner with various other sensors, used to detect irregularities in surrounding space. Can only run in vacuum to protect delicate quantum BS elements."
deep_scan_range = 0
/obj/machinery/shipsensors/strong /obj/machinery/shipsensors/strong
name = "sensors suite"
desc = "An upgrade to the standard ship-mounted sensor array, this beast has massive cooling systems running beneath it, allowing it to run hotter for much longer. Can only run in vacuum to protect delicate quantum BS elements." desc = "An upgrade to the standard ship-mounted sensor array, this beast has massive cooling systems running beneath it, allowing it to run hotter for much longer. Can only run in vacuum to protect delicate quantum BS elements."
icon_state = "sensor_suite" icon_state = "sensor_suite"
heat_reduction = 3.7 // can sustain range 6 heat_reduction = 3.7 // can sustain range 6
max_range = 14 max_range = 14
deep_scan_range = 6
deep_scan_sensor_name = "High-Power Sensor Array"
/obj/machinery/shipsensors/strong/venator
name = "venator-class quantum sensor array"
desc = "An incredibly advanced sensor array, created using top of the line technology in every conceivable area. Not only does it far outperform and outclass every other sensors system, it also boasts revolutionary quantum long-range sensors."
deep_scan_range = 12
deep_scan_sensor_name = "Venator-Class Ultra-High Depth Sensors"

View File

@@ -17,6 +17,8 @@ var/const/OVERMAP_SPEED_CONSTANT = (1 SECOND)
icon_state = "generic" icon_state = "generic"
requires_contact = TRUE requires_contact = TRUE
obfuscated_name = "unidentified vessel" obfuscated_name = "unidentified vessel"
sensor_range_override = FALSE
hide_from_reports = TRUE
var/moving_state = "ship_moving" var/moving_state = "ship_moving"
var/list/known_ships = list() //List of ships known at roundstart - put types here. var/list/known_ships = list() //List of ships known at roundstart - put types here.

View File

@@ -19,11 +19,8 @@ var/list/greek_letters = list("Alpha", "Beta", "Gamma", "Delta",
"Nu", "Xi", "Omicron", "Pi", "Rho", "Sigma", "Tau", "Upsilon", "Phi", "Nu", "Xi", "Omicron", "Pi", "Rho", "Sigma", "Tau", "Upsilon", "Phi",
"Chi", "Psi", "Omega") "Chi", "Psi", "Omega")
/proc/generate_system_name()
return "[pick("CRZ", "BNM", "Xavier", "GJ", "HD", "TC")][prob(10) ? " Eridani" : ""] [rand(100,999)]"
/proc/generate_planet_name() /proc/generate_planet_name()
return "[capitalize(pick(last_names))]-[pick(greek_letters)]" return "[capitalize(pick(last_names))]-[pick(greek_letters)]"
/proc/generate_planet_type() /proc/generate_planet_type()
return pick("terrestial planet", "ice planet", "dwarf planet", "desert planet", "ocean planet", "lava planet", "gas giant", "forest planet") return pick("terrestial planet", "ice planet", "dwarf planet", "desert planet", "ocean planet", "lava planet", "gas giant", "forest planet")

View File

@@ -0,0 +1,43 @@
################################
# Example Changelog File
#
# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
#
# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
# When it is, any changes listed below will disappear.
#
# Valid Prefixes:
# bugfix
# wip (For works in progress)
# tweak
# soundadd
# sounddel
# rscadd (general adding of nice things)
# rscdel (general deleting of nice things)
# imageadd
# imagedel
# maptweak
# spellcheck (typo fixes)
# experiment
# balance
# admin
# backend
# security
# refactor
#################################
# Your name.
author: MattAtlas
# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
delete-after: True
# Any changes you've made. See valid prefix list above.
# INDENT WITH TWO SPACES. NOT TABS. SPACES.
# SCREW THIS UP AND IT WON'T WORK.
# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
changes:
- rscadd: "Added high-power sensors. When toggled at a sensor console (must be using normal or better sensors) they will scan things through opaque overmap objects in a wide range. They add heat, so be careful."
- rscadd: "A report containing the bearings of all overmap objects is now sent to Horizon command consoles within 180 seconds from roundstart."
- bugfix: "Fixed there being odd rows of blank spaces before sensor contacts."

View File

@@ -213,6 +213,9 @@
return list(spawn_cost, player_cost, ship_cost) return list(spawn_cost, player_cost, ship_cost)
/datum/map/proc/send_welcome()
return
/datum/map/proc/build_away_sites() /datum/map/proc/build_away_sites()
#ifdef UNIT_TEST #ifdef UNIT_TEST
log_admin("Unit testing, so not loading away sites") log_admin("Unit testing, so not loading away sites")

View File

@@ -132,3 +132,59 @@
allow_borgs_to_leave = TRUE allow_borgs_to_leave = TRUE
warehouse_basearea = /area/operations/storage warehouse_basearea = /area/operations/storage
/datum/map/sccv_horizon/send_welcome()
var/obj/effect/overmap/visitable/ship/horizon = SSshuttle.ship_by_type(/obj/effect/overmap/visitable/ship/sccv_horizon)
var/welcome_text = "<center><img src = scclogo.png><br />[FONT_LARGE("<b>SCCV Horizon</b> Ultra-Range Sensor Readings:")]<br>"
welcome_text += "Report generated on [worlddate2text()] at [worldtime2text()]</center><br /><br />"
welcome_text += "<hr>Current sector:<br /><b>[SSatlas.current_sector.name]</b><br /><br>"
if (horizon) //If the overmap is disabled, it's possible for there to be no Horizon.
var/list/space_things = list()
welcome_text += "Current Coordinates:<br /><b>[horizon.x]:[horizon.y]</b><br /><br>"
welcome_text += "Next system targeted for jump:<br /><b>[SSatlas.current_sector.generate_system_name()]</b><br /><br>"
var/last_visit
var/current_day = time2text(world.realtime, "Day")
switch(current_day)
if("Monday")
last_visit = "1 day ago"
if("Tuesday")
last_visit = "2 days ago"
if("Wednesday")
last_visit = "3 days ago"
if("Thursday")
last_visit = "4 days ago"
if("Friday")
last_visit = "5 days ago"
if("Saturday")
last_visit = "6 days ago"
if("Sunday")
last_visit = "1 week ago"
welcome_text += "Last port visit: <br><b>[last_visit]</b><br><br>"
welcome_text += "Travel time to nearest port:<br /><b>[SSatlas.current_sector.get_port_travel_time()]</b><br /><br>"
welcome_text += "Scan results show the following points of interest:<br />"
for(var/zlevel in map_sectors)
var/obj/effect/overmap/visitable/O = map_sectors[zlevel]
if(O.name == horizon.name)
continue
if(istype(O, /obj/effect/overmap/visitable/ship/landable)) //Don't show shuttles
continue
if (O.hide_from_reports)
continue
space_things |= O
for(var/obj/effect/overmap/visitable/O in space_things)
var/location_desc = " at present co-ordinates."
if(O.loc != horizon.loc)
var/bearing = round(90 - Atan2(O.x - horizon.x, O.y - horizon.y),5) //fucking triangles how do they work
if(bearing < 0)
bearing += 360
location_desc = ", bearing [bearing]."
welcome_text += "<li>\A <b>[O.name]</b>[location_desc]</li>"
welcome_text += "<hr>"
post_comm_message("SCCV Horizon Sensor Readings", welcome_text)
priority_announcement.Announce(message = "Long-range sensor readings have been printed out at all communication consoles.")

View File

@@ -13047,10 +13047,10 @@
/turf/simulated/floor/tiled, /turf/simulated/floor/tiled,
/area/bridge/controlroom) /area/bridge/controlroom)
"kBl" = ( "kBl" = (
/obj/machinery/shipsensors/strong{ /obj/effect/floor_decal/industrial/warning/full,
/obj/machinery/shipsensors/strong/venator{
pixel_y = 7 pixel_y = 7
}, },
/obj/effect/floor_decal/industrial/warning/full,
/turf/simulated/floor/reinforced/airless, /turf/simulated/floor/reinforced/airless,
/area/bridge/controlroom) /area/bridge/controlroom)
"kCw" = ( "kCw" = (
@@ -30203,8 +30203,8 @@
}, },
/obj/item/stack/material/plasteel{ /obj/item/stack/material/plasteel{
amount = 20; amount = 20;
pixel_y = 3; pixel_x = 5;
pixel_x = 5 pixel_y = 3
}, },
/obj/item/stack/material/steel/full{ /obj/item/stack/material/steel/full{
pixel_x = 5 pixel_x = 5

View File

@@ -1,6 +1,6 @@
<h3>Sensors control console</h3> <h3>Sensor Array Control Console</h3>
<div class='block'> <div class='block'>
{{:helper.link(data.on ? 'Switch off' : 'Switch on', 'gear', { 'toggle' : 1 }, data.status != 'MISSING' ? null : 'disabled', data.on ? 'selected' : null)}} {{:helper.link(data.on ? 'Switch Off' : 'Switch On', 'gear', { 'toggle' : 1 }, data.status != 'MISSING' ? null : 'disabled', data.on ? 'selected' : null)}}
<div class='item'> <div class='item'>
<div class="itemLabel"> <div class="itemLabel">
<span class='white'>Status:</span> <span class='white'>Status:</span>
@@ -19,6 +19,17 @@
{{/for}} {{/for}}
</div> </div>
</div> </div>
{{if data.deep_scan_range > 0}}
<div class='item'>
<div class="itemLabel">
<span class='white'>{{:data.deep_scan_name}}</span>
</div>
<div class="itemContent">
<span class='white'>Effective Range: {{:data.deep_scan_range}}</span>
{{:helper.link(data.deep_scan_toggled ? 'Deactivate' : 'Activate', 'gear', {'deep_scan_toggle' : 1}, data.status != 'MISSING' ? null : 'disabled', data.deep_scan_toggled ? 'selected' : null)}}
</div>
</div>
{{/if}}
</div> </div>
<div class='block'> <div class='block'>
<div class='item'> <div class='item'>
@@ -105,18 +116,15 @@
</div> </div>
</div> </div>
</div> </div>
<h4>Sensor contacts</h4>
<h4>Sensor Contacts</h4> <h4>Sensor Contacts</h4>
<div class='block'> <div class='block'>
{{if data.contacts}} {{if data.contacts}}
<table> <table>
{{for data.contacts}} {{for data.contacts}}
<tr> <tr>
<div class='item'> <td>{{:helper.link('Scan', 'search' ,{ 'scan' : value.ref }, null, null)}}</td>
<td>{{:helper.link('Scan', 'search' ,{ 'scan' : value.ref }, null, null)}}</td>
<td>{{:helper.link('Datalink', 'search' ,{ 'request_datalink' : value.ref }, null, null)}}</td> <td>{{:helper.link('Datalink', 'search' ,{ 'request_datalink' : value.ref }, null, null)}}</td>
<td><span class='white'>{{:value.name}}</span>, bearing {{:value.bearing}}</td> <td><span class='white'>{{:value.name}}</span>, bearing {{:value.bearing}}</td>
</div>
</tr> </tr>
{{/for}} {{/for}}
</table> </table>