main
sandyx 1 year ago
parent cc6798565d
commit f1703f9c87

@ -0,0 +1,705 @@
<Run version="1.7.0">
<GameIcon />
<GameName>Half-Life 2</GameName>
<CategoryName>Xbox Scripted</CategoryName>
<Metadata>
<Run id="" />
<Platform usesEmulator="False"></Platform>
<Region></Region>
<Variables />
</Metadata>
<Offset>00:00:00</Offset>
<AttemptCount>0</AttemptCount>
<AttemptHistory />
<Segments>
<Segment>
<Name>d1_trainstation_01</Name>
<SplitTimes>
<SplitTime>
<RealTime>00:00:10.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d1_trainstation_02</Name>
<SplitTimes>
<SplitTime>
<RealTime>00:03:48.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d1_trainstation_03</Name>
<SplitTimes>
<SplitTime>
<RealTime>00:04:27.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d1_trainstation_04</Name>
<SplitTimes>
<SplitTime>
<RealTime>00:06:31.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d1_trainstation_05</Name>
<SplitTimes>
<SplitTime>
<RealTime>00:14:30.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d1_trainstation_06</Name>
<SplitTimes>
<SplitTime>
<RealTime>00:16:18.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d1_canals_01</Name>
<SplitTimes>
<SplitTime>
<RealTime>00:18:31.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d1_canals_01a</Name>
<SplitTimes>
<SplitTime>
<RealTime>00:20:14.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d1_canals_01b</Name>
<SplitTimes>
<SplitTime>
<RealTime>00:21:27.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d1_canals_02</Name>
<SplitTimes>
<SplitTime>
<RealTime>00:22:03.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d1_canals_03</Name>
<SplitTimes>
<SplitTime>
<RealTime>00:24:22.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d1_canals_04</Name>
<SplitTimes>
<SplitTime>
<RealTime>00:26:12.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d1_canals_05a</Name>
<SplitTimes>
<SplitTime>
<RealTime>00:26:49.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d1_canals_05b</Name>
<SplitTimes>
<SplitTime>
<RealTime>00:27:57.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d1_canals_06a</Name>
<SplitTimes>
<SplitTime>
<RealTime>00:29:17.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d1_canals_06b</Name>
<SplitTimes>
<SplitTime>
<RealTime>00:30:46.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d1_canals_07a</Name>
<SplitTimes>
<SplitTime>
<RealTime>00:32:39.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d1_canals_07b</Name>
<SplitTimes>
<SplitTime>
<RealTime>00:34:10.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d1_canals_08</Name>
<SplitTimes>
<SplitTime>
<RealTime>00:35:56.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d1_canals_09</Name>
<SplitTimes>
<SplitTime>
<RealTime>00:37:36.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d1_canals_10a</Name>
<SplitTimes>
<SplitTime>
<RealTime>00:38:07.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d1_canals_10b</Name>
<SplitTimes>
<SplitTime>
<RealTime>00:39:44.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d1_canals_11a</Name>
<SplitTimes>
<SplitTime>
<RealTime>00:40:18.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d1_canals_11b</Name>
<SplitTimes>
<SplitTime>
<RealTime>00:41:59.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d1_canals_12a</Name>
<SplitTimes>
<SplitTime>
<RealTime>00:42:48.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d1_canals_12b</Name>
<SplitTimes>
<SplitTime>
<RealTime>00:44:21.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d1_canals_13</Name>
<SplitTimes>
<SplitTime>
<RealTime>00:45:18.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d1_eli_01</Name>
<SplitTimes>
<SplitTime>
<RealTime>00:52:51.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d1_eli_02</Name>
<SplitTimes>
<SplitTime>
<RealTime>00:53:55.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d1_town_01</Name>
<SplitTimes>
<SplitTime>
<RealTime>00:54:33.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d1_town_01a</Name>
<SplitTimes>
<SplitTime>
<RealTime>00:56:15.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d1_town_01b</Name>
<SplitTimes>
<SplitTime>
<RealTime>00:57:17.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d1_town_02</Name>
<SplitTimes>
<SplitTime>
<RealTime>00:59:43.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d1_town_02a</Name>
<SplitTimes>
<SplitTime>
<RealTime>01:00:00.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d1_town_04</Name>
<SplitTimes>
<SplitTime>
<RealTime>01:01:00.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d1_town_05</Name>
<SplitTimes>
<SplitTime>
<RealTime>01:03:00.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d2_coast_01</Name>
<SplitTimes>
<SplitTime>
<RealTime>01:04:00.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d2_coast_03a</Name>
<SplitTimes>
<SplitTime>
<RealTime>01:06:00.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d2_coast_03b</Name>
<SplitTimes>
<SplitTime>
<RealTime>01:06:30.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d2_coast_04</Name>
<SplitTimes>
<SplitTime>
<RealTime>01:08:00.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d2_coast_05</Name>
<SplitTimes>
<SplitTime>
<RealTime>01:10:00.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d2_coast_07</Name>
<SplitTimes>
<SplitTime>
<RealTime>01:12:00.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d2_coast_09a</Name>
<SplitTimes>
<SplitTime>
<RealTime>01:13:00.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d2_coast_09b</Name>
<SplitTimes>
<SplitTime>
<RealTime>01:15:00.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d2_coast_10</Name>
<SplitTimes>
<SplitTime>
<RealTime>01:16:00.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d2_coast_11a</Name>
<SplitTimes>
<SplitTime>
<RealTime>01:17:00.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d2_coast_11b</Name>
<SplitTimes>
<SplitTime>
<RealTime>01:19:00.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d2_coast_12</Name>
<SplitTimes>
<SplitTime>
<RealTime>01:21:00.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d2_prison_01</Name>
<SplitTimes>
<SplitTime>
<RealTime>01:23:00.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d2_prison_02</Name>
<SplitTimes>
<SplitTime>
<RealTime>01:23:30.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d2_prison_03a</Name>
<SplitTimes>
<SplitTime>
<RealTime>01:24:00.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d2_prison_03b</Name>
<SplitTimes>
<SplitTime>
<RealTime>01:25:00.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d2_prison_04</Name>
<SplitTimes>
<SplitTime>
<RealTime>01:26:00.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d2_prison_05a</Name>
<SplitTimes>
<SplitTime>
<RealTime>01:27:00.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d2_prison_05b</Name>
<SplitTimes>
<SplitTime>
<RealTime>01:29:00.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d2_prison_06a</Name>
<SplitTimes>
<SplitTime>
<RealTime>01:31:00.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d2_prison_06b</Name>
<SplitTimes>
<SplitTime>
<RealTime>01:32:00.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d2_prison_07a</Name>
<SplitTimes>
<SplitTime>
<RealTime>01:32:30.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d2_prison_07b</Name>
<SplitTimes>
<SplitTime>
<RealTime>01:33:00.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d2_prison_08</Name>
<SplitTimes>
<SplitTime>
<RealTime>01:39:00.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d3_c17_01</Name>
<SplitTimes>
<SplitTime>
<RealTime>01:40:00.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d3_c17_02</Name>
<SplitTimes>
<SplitTime>
<RealTime>01:41:00.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d3_c17_03</Name>
<SplitTimes>
<SplitTime>
<RealTime>01:42:00.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d3_c17_04</Name>
<SplitTimes>
<SplitTime>
<RealTime>01:43:00.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d3_c17_05</Name>
<SplitTimes>
<SplitTime>
<RealTime>01:46:00.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d3_c17_06</Name>
<SplitTimes>
<SplitTime>
<RealTime>01:46:30.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d3_c17_06a</Name>
<SplitTimes>
<SplitTime>
<RealTime>01:48:00.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d3_c17_06b</Name>
<SplitTimes>
<SplitTime>
<RealTime>01:49:00.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d3_c17_07</Name>
<SplitTimes>
<SplitTime>
<RealTime>01:50:00.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d3_c17_08</Name>
<SplitTimes>
<SplitTime>
<RealTime>01:51:00.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d3_c17_08a</Name>
<SplitTimes>
<SplitTime>
<RealTime>01:52:00.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d3_c17_09</Name>
<SplitTimes>
<SplitTime>
<RealTime>01:54:00.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d3_c17_10a</Name>
<SplitTimes>
<SplitTime>
<RealTime>01:56:00.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d3_c17_10b</Name>
<SplitTimes>
<SplitTime>
<RealTime>01:57:00.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d3_c17_11</Name>
<SplitTimes>
<SplitTime>
<RealTime>01:59:00.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d3_c17_12</Name>
<SplitTimes>
<SplitTime>
<RealTime>02:01:00.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d3_c17_12b</Name>
<SplitTimes>
<SplitTime>
<RealTime>02:02:00.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d3_c17_13</Name>
<SplitTimes>
<SplitTime>
<RealTime>02:03:00.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d3_citadel_01</Name>
<SplitTimes>
<SplitTime>
<RealTime>02:08:00.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d3_citadel_02</Name>
<SplitTimes>
<SplitTime>
<RealTime>02:11:00.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d3_citadel_03</Name>
<SplitTimes>
<SplitTime>
<RealTime>02:12:00.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d3_citadel_04a</Name>
<SplitTimes>
<SplitTime>
<RealTime>02:16:00.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d3_citadel_04b</Name>
<SplitTimes>
<SplitTime>
<RealTime>02:17:30.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d3_citadel_05</Name>
<SplitTimes>
<SplitTime>
<RealTime>02:19:00.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d3_breen_01a</Name>
<SplitTimes>
<SplitTime>
<RealTime>02:24:00.00</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
<Segment>
<Name>d3_breen_01b</Name>
<SplitTimes>
<SplitTime>
<RealTime>02:30:06.78</RealTime>
</SplitTime>
</SplitTimes>
</Segment>
</Segments>
<AutoSplitterSettings />
</Run>

@ -0,0 +1,29 @@
#lss_builder.rb
#just make a list of names
#and a list of times
#
#make sure they have the same
#number of lines
#maybe ill make a splits editor sometime
def wrap(tag, str)
return "<#{tag}>#{str}</#{tag}>"
end
name_lines = File.readlines("splits.txt")
time_lines = File.readlines("times.txt")
both = name_lines.zip(time_lines)
print both
out = both.map { |x|
realtime = wrap("RealTime", x[1].strip)
splittime = wrap("SplitTime", realtime)
splittimes = wrap("SplitTimes", splittime)
name_tag = wrap("Name", x[0].strip)
segment_tag = wrap("Segment", name_tag + splittimes)
}
File.write("output.txt", out.join(""))

@ -1,5 +1,6 @@
#include "controller.h"
#include "segment_renderer.h"
#include <stdio.h>
int *splits = 0;
@ -26,17 +27,53 @@ inline void ctrl_pause(ghost timer) {
ctrl_pause_igt(timer);
}
void ctrl_record_segment(ctrl_binder *cb) {
ghost ghost = cb->timer;
segment *segment = &cb->live_sl->segments[cb->current_segment];
segment->realtime = ghtimer_time(ghost.rta);
segment->gametime = ghtimer_time(ghost.igt);
//need a condition for igt here
//cb->delta_sl->segments[cb->current_segment].realtime = subts(segment->realtime, cb->rec_sl->segments[cb->current_segment].realtime);
struct timespec a, b;
a = segment->realtime;
b = cb->rec_sl->segments[cb->current_segment].realtime;
//b = (struct timespec) {10};
char abuf[64];
char bbuf[64];
char dbuf[64];
struct timespec d = subts(a, b);
time_unparse(dbuf, FMT_SIZE, &d);
if (time_cmp(b, a)) {
//printf("GRN: %s - %s = %s\n", time_unparse(abuf, FMT_SIZE, &a), time_unparse(bbuf, FMT_SIZE, &b), dbuf);
cb->delta_sl->segments[cb->current_segment].realtime = subts(b, a);
cb->delta_sl->segments[cb->current_segment].positive = 1;
} else {
//printf("RED: %s - %s = %s\n", time_unparse(abuf, FMT_SIZE, &a), time_unparse(bbuf, FMT_SIZE, &b), dbuf);
cb->delta_sl->segments[cb->current_segment].realtime = subts(a, b);
cb->delta_sl->segments[cb->current_segment].positive = 0;
}
//cb->delta_sl->segments[cb->current_segment].realtime = subts((struct timespec){10}, segment->realtime);
cb->delta_sl->segments[cb->current_segment].gametime = subts(segment->gametime, segment->gametime);
}
//this function handles everything
void ctrl_start(ctrl_binder *cb) {
//vars for easier code reading
segment *current_segment = &cb->live_sl->segments[cb->current_segment];
if (cb->timer.rta->running) {
if (cb->rec_sl != NULL) {
if (cb->current_segment < cb->live_sl->count) {
cb->live_sl->segments[cb->current_segment].realtime = ghtimer_time(cb->timer.rta);
//need to add a condition for igt
//cb->sr->scroller = scroll(cb->sr->scroller);
ctrl_record_segment(cb);
} else {
goto STOP;
}
cb->current_segment++;
cb->sr->current = cb->current_segment;
scroll_down(cb->sr->scroller);
@ -45,14 +82,14 @@ STOP:
cb->current_segment = 0;
cb->sr->running = false;
cb->sr->current = cb->current_segment;
ghtimer_stop(cb->timer.rta); //stop or reset, save splits
ghost_op(cb->timer, ghtimer_stop);
scroll_reset(cb->sr->scroller);
}
//pause timer if last split
if (cb->current_segment == cb->live_sl->count) {
cb->sr->running = false;
ghtimer_pause(cb->timer.rta);
ghost_op(cb->timer, ghtimer_pause); //for both igt and rta
return;
}
} else {
@ -68,13 +105,40 @@ void ctrl_bind_timer_renderer(ctrl_binder *cb, timer_renderer *timer) {
}
void ctrl_bind_segment_renderer(ctrl_binder *cb, segment_renderer *segmer) {
cb->sr = segmer;
//yikes
cb->sr->scroller->delta_sl = *cb->delta_sl;
cb->sr->scroller->delta_segs = cb->delta_sl->segments;
}
ctrl_binder *create_ctrl_binder(ghost timer, segment_list *sl) {
ctrl_binder *binder = calloc(1, sizeof(ctrl_binder));
segment_list *zero = calloc(1, sizeof(segment_list));
zero->count = sl->count;
zero->segments = calloc(zero->count, sizeof(segment));
for (int i = 0; i < zero->count; i++) {
zero->segments[i].realtime = (struct timespec){0};
}
ctrl_binder *binder = calloc(1, sizeof(*binder));
binder->timer = timer;
binder->rec_sl = sl;
binder->live_sl = sl;
//binder->rec_sl = zero;
binder->live_sl = zero;
//allocate an array for the delta times
binder->delta_sl = calloc(1, sizeof(*binder->delta_sl));
binder->delta_sl->count = sl->count;
binder->delta_sl->segments = calloc(binder->delta_sl->count, sizeof(segment));
return binder;
}
//bind recorded segments from file
void ctrl_bind_segments(ctrl_binder *cb, segment_list *rec) {
cb->rec_sl = rec;
}
void destroy_ctrl_binder(ctrl_binder *cb) {
free(cb->delta_sl);
free(cb);
}

@ -12,7 +12,7 @@
typedef struct ctrl_binder {
ghost timer;
segment_list *rec_sl, *live_sl;
segment_list *rec_sl, *live_sl, *delta_sl;
timer_renderer *tr;
segment_renderer *sr;
int current_segment;
@ -21,6 +21,7 @@ typedef struct ctrl_binder {
ctrl_binder *create_ctrl_binder(ghost timer, segment_list *sl);
void ctrl_bind_timer_renderer(ctrl_binder *cb, timer_renderer *timer);
void ctrl_bind_segment_renderer(ctrl_binder *cb, segment_renderer *segmer);
void ctrl_bind_segments(ctrl_binder *cb, segment_list *sl);
void ctrl_start(ctrl_binder *cb);
void ctrl_pause(ghost timer);
void ctrl_pause_igt(ghost timer);

@ -4,9 +4,7 @@
//#include "fmt.h"
#include "segment_renderer.h"
#include "controller.h"
//#include "scanner.h"
#include "splits.h"
//#include "parser.c"
#include <stdio.h>
#if defined(PLATFORM_DESKTOP)
@ -25,7 +23,7 @@ int remote_state = 0;
Font font;
//extern this for other files
//extern this in other files
void error(const char *msg) {
fprintf(stderr, ERROR, msg);
exit(EXIT_FAILURE);
@ -43,10 +41,6 @@ void control(void) {
}
int main(int argc, char *argv[]) {
//font = LoadFontEx("/usr/share/fonts/CozetteVector.ttf", 400, 0, 0);
// GenTextureMipmaps(&font.texture);
if (argc < 2) {
error("gimme file");
exit(EXIT_FAILURE);
@ -69,39 +63,37 @@ int main(int argc, char *argv[]) {
ghost ghost = ghost_new();
ctrl_binder *binder = create_ctrl_binder(ghost, &segs);
ctrl_bind_segments(binder, &segs);
//make a layout manager for these
timer_renderer *tr = create_timer_renderer(ghost, (Vector2){0.0f, windowHeight/8 * 6}, (Vector2){(float)windowWidth, (float)windowHeight/8});
timer_renderer *tr = create_timer_renderer(
ghost,
(Vector2){0.0f, windowHeight/8 * 6},
(Vector2){(float)windowWidth, (float)windowHeight/8}
);
segment_renderer *sr = create_segment_renderer(segs, 0.0f, 0.0f);
ctrl_bind_timer_renderer(binder, tr);
ctrl_bind_segment_renderer(binder, sr);
//uint8_t buffer[1024];
// float fontSize = (float)font.baseSize;
float fontSize = (float)font.baseSize;
while (!WindowShouldClose()) {
ghost_tick(ghost);
//ghtimer_timestring(ghost.rta, buffer);
if (IsKeyPressed(KEY_P)) {
ctrl_start(binder);
}
BeginDrawing();
//BeginShaderMode(shader);
ClearBackground(BLACK);
//DrawTexture(texture, 0, 0, WHITE);
//EndShaderMode();
//need to make this not weird
render_segments(sr);
render_timer(tr);
//EndShaderMode();
//printf("cunt\n");
EndDrawing();
}
//ghost_delete(ghost);
ghost_delete(ghost);
CloseWindow();
}

@ -24,8 +24,10 @@ void scroll_down(scroller *s) {
if (s->view_index >= s->sl.count - s->count) {
return;
}
s->view_index++;
s->segs = &s->sl.segments[s->view_index];
s->delta_segs = &s->delta_sl.segments[s->view_index];
//printf("%d %d\n", s->view_index, s->sl.count - s->count);
}
@ -35,6 +37,10 @@ void scroll_reset(scroller *s) {
s->segs = &s->sl.segments[s->view_index];
}
void destroy_scroller(scroller *s) {
free(s);
}
segment_renderer *create_segment_renderer(segment_list sl, float y, float h) {
segment_renderer *sr = (segment_renderer *)calloc(1, sizeof(*sr));
sr->pos = y;
@ -44,8 +50,7 @@ segment_renderer *create_segment_renderer(segment_list sl, float y, float h) {
sr->current = 0;
sr->running = false;
sr->shader = NULL;
sr->scroller = create_scroller(13, sl);
//printf("cunt %p\n%p\n", s, sr->scroller);
sr->scroller = create_scroller(15, sl);
return sr;
}
@ -58,12 +63,13 @@ void set_segment_count(segment_renderer *sr, int c) {
}
void destroy_segment_renderer(segment_renderer *sr) {
free(sr->scroller);
free(sr);
}
void render_segments(segment_renderer *sr) {
Color color[2] = {RED, GREEN};
void render_segments(segment_renderer *sr) {
//need to not draw it if its the last split
//or if the timer isnt running
if (sr->running) {
@ -73,9 +79,25 @@ void render_segments(segment_renderer *sr) {
//draw a big rectangle the size of the segment thing
//DrawRectangle(0, 0, windowWidth, 90, BLACK);
//for (int i = 0; i < sr->scroller->index; i++) {
//DrawTextEx(font, time_unparse(sr->strfmt, FMT_SIZE, &sr->scroller->delta_segs[i].realtime), (Vector2){280, 30 * i}, (float)font.baseSize/20, 2, GREEN);
//}
for (int i = 0; i < sr->scroller->count; i++) {
//int j = i + sr->scroller->index;
//DrawText(sr->scroller->segs[i].name, (Vector2){10, 30 * i}.x, (Vector2){10, 30 * i}.y, 20, WHITE);
DrawTextEx(font, sr->scroller->segs[i].name, (Vector2){10, 30 * i}, 20, 2, WHITE);
DrawTextEx(font, time_unparse(sr->strfmt, FMT_SIZE, &sr->scroller->segs[i].realtime), (Vector2){350, 30 * i}, (float)font.baseSize/16, 2, WHITE);
DrawTextEx(font, sr->scroller->segs[i].name, (Vector2){10, 30 * i}, (float)font.baseSize/16, 2, WHITE);
//if the segment has been splitted upon, display the delta instead
if (sr->scroller->index <= i) {
char *time = time_unparse(sr->strfmt, FMT_SIZE, &sr->scroller->segs[i].realtime);
Vector2 m = MeasureTextEx(font, time, font.baseSize/16, 2);
DrawTextEx(font, time, (Vector2){410 - m.x, 30 * i}, (float)font.baseSize/16, 2, WHITE);
} else {
char *time = time_unparse(sr->strfmt, FMT_SIZE, &sr->scroller->delta_segs[i].realtime);
Vector2 m = MeasureTextEx(font, time, font.baseSize/16, 2);
DrawTextEx(font, time_unparse(sr->strfmt, FMT_SIZE, &sr->scroller->delta_segs[i].realtime), (Vector2){410 - m.x, 30 * i}, (float)font.baseSize/16, 2, color[sr->scroller->delta_segs[i].positive]);
}
}
}

@ -13,12 +13,17 @@ extern Font font;
//need to implement scrolling when total_splits > visible
typedef struct delta {
segment *seg;
bool positive;
} delta;
typedef struct scroller {
int count;
int index; //where the bar should be on the splits
int view_index; //the first split displayed
segment *segs;
segment_list sl;
segment *segs, *delta_segs;
segment_list sl, delta_sl;
} scroller;
scroller *create_scroller(int c, segment_list sl);

@ -111,6 +111,33 @@ struct xml_string *get_name_string(struct xml_node *node) {
return NULL;
}
struct xml_string *get_time_string(struct xml_node *node) {
struct xml_node *iter;
for (int i = 0; i < xml_node_children(node); i++) {
if (xml_name_compare(xml_node_child(node, i), "SplitTimes")) {
iter = xml_node_child(node, i);
break;
}
}
for (int i = 0; i < xml_node_children(iter); i++) {
if (xml_name_compare(xml_node_child(iter, i), "SplitTime")) {
iter = xml_node_child(iter, i);
break;
}
}
for (int i = 0; i < xml_node_children(iter); i++) {
if (xml_name_compare(xml_node_child(iter, i), "RealTime")) {
iter = xml_node_child(iter, i);
return xml_node_content(iter);
}
}
return NULL;
}
uint8_t **extract(segment_nodes segments, struct xml_string *(operation)(struct xml_node *)) {
struct xml_string **xml_strings = calloc(segments.count, sizeof(struct xml_string *));
@ -178,7 +205,7 @@ segment_list open_splits_file(const char *path) {
error("Could not parse xml");
}
printf("splits.c: parsed %s successfully\n", path);
//printf("splits.c: parsed %s successfully\n", path);
int children = 0;
struct xml_node *root = xml_document_root(xml);
@ -186,6 +213,7 @@ segment_list open_splits_file(const char *path) {
struct xml_node *segments_node = get_segments_node(root);
segment_nodes segments = get_node_children(segments_node);
uint8_t **segment_names = extract(segments, get_name_string);
uint8_t **segment_times = extract(segments, get_time_string);
printf("open_splits_file: %d\n", segments.count);
@ -196,17 +224,23 @@ segment_list open_splits_file(const char *path) {
segment_list seglist = {0};
printf("open_splits_file: %d\n", segments.count);
printf("%ld\n", segments.count * sizeof(segment));
long long what = segments.count * sizeof(segment);
printf("what: %lld\n", what);
segment *segs = malloc(1008);
printf("?\n");
//printf("%ld\n", segments.count * sizeof(segment));
//long long what = segments.count * sizeof(segment);
//printf("what: %lld\n", what);
//segment *segs = malloc(1008);
segment *segs = malloc(segments.count * sizeof(*segs));
//printf("?\n");
for (int i = 0; i < segments.count; i++) {
segs[i].name = segment_names[i];
//segs[i].realtime = (struct timespec){0};
if (segment_times[i] != NULL) {
segs[i].realtime = parse_time(segment_times[i]);
printf("%s\n", segment_times[i]);
}
}
printf("splits.c: parsed %s successfully\n", path);
seglist.segments = segs;
seglist.count = segments.count;
return seglist;

@ -11,6 +11,8 @@ struct segment {
struct timespec gametime;
struct timespec best;
char *name;
bool positive; //for delta times
//i'm too lazy to make deltas their own struct
//segment *next;
};
@ -19,11 +21,11 @@ typedef struct segment_list {
int count;
} segment_list;
//binds two lists of segments together
//binds two lists of segments and a delta together
typedef struct segment_binder {
segment_list *rta;
segment_list *igt;
} segment_binder;
} segment_binder; //why do i need this
segment_list open_splits_file(const char *path);
void render_splits(segment_list *segments);

@ -1,5 +1,8 @@
#include "timer.h"
#include <stdio.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
#include "timer.h"
struct timespec subts(struct timespec t1, struct timespec t2) {
return (struct timespec) {
@ -19,6 +22,10 @@ double timespec_to_double(struct timespec ts) {
return ((double)(ts.tv_sec) + ((double)(ts.tv_nsec) / NSEC_PER_SEC));
}
//is t1 greater than t2
bool time_cmp(struct timespec t1, struct timespec t2) {
return timespec_to_double(t1) > timespec_to_double(t2);
}
ghtimer *ghtimer_new(void) {
ghtimer *timer = calloc(1, sizeof(ghtimer));
@ -125,3 +132,27 @@ void ghost_start(ghost ghost) {
ghtimer_start(ghost.rta);
ghtimer_start(ghost.igt);
}
void ghost_pause(ghost ghost) {
ghtimer_pause(ghost.rta);
ghtimer_pause(ghost.igt);
}
void ghost_resume(ghost ghost) {
ghtimer_resume(ghost.rta);
ghtimer_resume(ghost.igt);
}
void ghost_igt_pause(ghost ghost) {
ghtimer_pause(ghost.igt);
}
void ghost_igt_resume(ghost ghost) {
ghtimer_resume(ghost.igt);
}
//may make things easier for the controller
void ghost_op(ghost ghost, void(*op)(ghtimer *)) {
op(ghost.rta);
op(ghost.igt);
}

@ -1,20 +1,20 @@
#ifndef TIMER_H
#define TIMER_H
#include <stdio.h>
#include <stdbool.h>
#include <stdint.h>
#include <time.h>
#include <stdbool.h>
#define NSEC_PER_SEC 1000000000
struct timespec subts(struct timespec t1, struct timespec t2);
struct timespec addts(struct timespec t1, struct timespec t2);
double timespec_to_double(struct timespec ts);
bool time_cmp(struct timespec t1, struct timespec t2);
//appended GH just incase theres a conflict with anything
//else named "Timer"
//a ghtimer is one individual timer
typedef struct ghtimer {
struct timespec start;
struct timespec current;
@ -25,7 +25,10 @@ typedef struct ghtimer {
int paused;
} ghtimer;
//two timers tied together
/*
a ghost is a real time and
in game time timer tied together
*/
typedef struct ghost {
ghtimer *rta;
ghtimer *igt;
@ -48,5 +51,10 @@ ghost ghost_rta_new(void);
void ghost_delete(ghost ghost); //free and set to NULL
void ghost_tick(ghost ghost);
void ghost_start(ghost ghost);
void ghost_pause(ghost ghost);
void ghost_resume(ghost ghost);
void ghost_time(ghost ghost);
void ghost_igt_pause(ghost ghost);
void ghost_igt_resume(ghost ghost);
void ghost_op(ghost ghost, void(*op)(ghtimer *));
#endif

@ -24,7 +24,7 @@ void destroy_timer_renderer(timer_renderer *tr) {
void render_timer(timer_renderer *tr) {
struct timespec ts = ghtimer_time(tr->mode ? tr->timer.igt : tr->timer.rta);
time_unparse(tr->strfmt, FMT_SIZE, &ts);
Vector2 text_size = MeasureTextEx(font, tr->strfmt, (float)font.baseSize/4, 2);
Vector2 text_size = MeasureTextEx(font, tr->strfmt, (float)font.baseSize/5, 2);
//set_timer_pos(tr, (Vector2)tr->pos.y - text_size.y);
if (tr->shader != NULL) {
@ -38,5 +38,5 @@ void render_timer(timer_renderer *tr) {
EndShaderMode();
}
DrawTextEx(font, tr->strfmt , (Vector2){(float)windowWidth - text_size.x - 2.0f, tr->pos.y}, (float)font.baseSize / 4, 2, WHITE);
DrawTextEx(font, tr->strfmt , (Vector2){(float)windowWidth - text_size.x - 2.0f, tr->pos.y}, (float)font.baseSize / 5, 2, WHITE);
}

Loading…
Cancel
Save