marrub
/
Lithia
Archived
1
0
Fork 0
This repository has been archived on 2023-06-17. You can view files and clone it, but cannot push or open issues/pull-requests.
Lithia/source/Main/p_log.c

271 lines
5.8 KiB
C

// Copyright © 2016-2017 Graham Sanderson, all rights reserved.
#include "lith_common.h"
#include "lith_log.h"
#include "lith_player.h"
#include "lith_list.h"
#include "lith_hudid.h"
#include "lith_world.h"
#include <stdio.h>
// Extern Functions ----------------------------------------------------------|
//
// Lith_LogName
//
script acs void Lith_LogName(int name)
{
withplayer(LocalPlayer)
switch(name)
{
#define BOTH(name) case msg_##name: p->log ("%LS", "LITH_TXT_LOG_" #name); break;
#define FULL(name) case msg_##name: p->logF("%LS", "LITH_TXT_LOG_" #name); break;
#define HUDS(name) case msg_##name: p->logH("%LS", "LITH_TXT_LOG_" #name); break;
#define AMMO(name) case msg_##name: if(p->getCVarI("lith_player_ammolog")) p->logH("%LS", "LITH_TXT_LOG_" #name); break;
BOTH(allmap)
HUDS(armorbonus)
BOTH(backpack)
BOTH(berserk)
BOTH(bluearmor)
BOTH(blursphere)
BOTH(greenarmor)
HUDS(healthbonus)
BOTH(infrared)
BOTH(invuln)
BOTH(medikit)
BOTH(megasphere)
BOTH(radsuit)
BOTH(soulsphere)
BOTH(stimpack)
BOTH(redcard)
BOTH(bluecard)
BOTH(yellowcard)
BOTH(redskull)
BOTH(blueskull)
BOTH(yellowskull)
BOTH(doggosphere)
BOTH(dogs)
AMMO(clip)
AMMO(clipbox)
AMMO(shell)
AMMO(shellbox)
AMMO(rocket)
AMMO(rocketbox)
AMMO(cell)
AMMO(cellbox)
#undef BOTH
#undef FULL
#undef HUDS
#undef AMMO
}
}
//
// Lith_Log
//
void Lith_Log(struct player *p, __str fmt, ...)
{
va_list vl;
va_start(vl, fmt);
logdata_t *logdata = Lith_LogV(p, fmt, vl);
va_end(vl);
logdata->time = LOG_TIME;
logdata->link .link(&p->loginfo.hud);
logdata->linkfull.link(&p->loginfo.full);
logdata->keep = true;
if(p->loginfo.hud.size > LOG_MAX)
Dalloc(p->loginfo.hud.next->unlink());
}
//
// Lith_LogF
//
void Lith_LogF(struct player *p, __str fmt, ...)
{
va_list vl;
va_start(vl, fmt);
logdata_t *logdata = Lith_LogV(p, fmt, vl);
va_end(vl);
logdata->linkfull.link(&p->loginfo.full);
logdata->keep = true;
}
//
// Lith_LogH
//
void Lith_LogH(struct player *p, __str fmt, ...)
{
va_list vl;
va_start(vl, fmt);
logdata_t *logdata = Lith_LogV(p, fmt, vl);
va_end(vl);
logdata->time = LOG_TIME;
logdata->link.link(&p->loginfo.hud);
if(p->loginfo.hud.size > LOG_MAX)
Dalloc(p->loginfo.hud.next->unlink());
}
//
// Lith_LogV
//
logdata_t *Lith_LogV(struct player *p, __str fmt, va_list vl)
{
logdata_t *logdata = Salloc(logdata_t);
logdata->link .construct(logdata);
logdata->linkfull.construct(logdata);
ACS_BeginPrint();
__vnprintf_str(fmt, vl);
logdata->info = ACS_EndStrParam();
logdata->from = world.mapnum;
return logdata;
}
//
// Lith_PlayerUpdateLog
//
script void Lith_PlayerUpdateLog(struct player *p)
{
forlist(logdata_t *logdata, p->loginfo.hud)
{
if(logdata->time == 0)
{
list_t *next = rover->next;
rover->unlink();
if(!logdata->keep) Dalloc(logdata);
}
else
logdata->time--;
}
}
//
// Lith_HUD_Log
//
script void Lith_HUD_Log(struct player *p)
{
if(p->getCVarI("lith_hud_showlog"))
{
int cr;
switch(p->pclass) {
default: cr = CR_GREEN; break;
case pcl_cybermage: cr = CR_RED; break;
case pcl_informant: cr = CR_LIGHTBLUE; break;
}
ACS_SetHudSize(480, 300);
ACS_SetFont("LOGFONT");
int i = 0;
forlistIt(logdata_t *logdata, p->loginfo.hud, i++)
{
int y = 10 * i;
fixed align;
if(p->getCVarI("lith_hud_logfromtop")) {
y = 20 + y;
align = 0.1;
} else {
y = 255 - y;
align = 0.2;
switch(p->pclass) {
case pcl_cybermage: y -= 10; break;
case pcl_informant: y -= 15; break;
}
}
HudMessage("%S", logdata->info);
HudMessageParams(HUDMSG_NOWRAP, hid_logE + i, cr, 0.1, y+align, TS);
if(logdata->time > LOG_TIME - 10)
{
HudMessage("%S", logdata->info);
HudMessageParams(HUDMSG_NOWRAP | HUDMSG_FADEOUT | HUDMSG_ADDBLEND, hid_logAddE + i, cr, 0.1, y+align, TS, 0.15);
}
}
}
}
//
// Lith_PlayerLogEntry
//
void Lith_PlayerLogEntry(struct player *p)
{
logmap_t *logmap = Salloc(logmap_t);
logmap->link.construct(logmap);
logmap->levelnum = world.mapnum;
logmap->name = StrParam("%tS", PRINTNAME_LEVELNAME); // :|
logmap->link.link(&p->loginfo.maps);
p->logF("Entered %S at %S NE", logmap->name, world.canontime);
}
//
// Lith_CBITab_Log
//
void Lith_CBITab_Log(gui_state_t *g, struct player *p)
{
size_t num = 0;
int i = 0;
logmap_t *selmap;
list_t *sel = CBIState(g)->logsel;
if(!sel) sel = p->loginfo.maps.next;
if(Lith_GUI_Button(g, .x = 25, 38, Pre(btnprev)))
if((sel = sel->prev) == &p->loginfo.maps)
sel = sel->prev;
if(Lith_GUI_Button(g, .x = 25 + guipre.btnprev.w, 38, Pre(btnnext)))
if((sel = sel->next) == &p->loginfo.maps)
sel = sel->next;
CBIState(g)->logsel = sel;
selmap = sel->object;
HudMessageF("CBIFONT", "%S", selmap->name);
HudMessagePlain(g->hid--, 28.1 + guipre.btnprev.w + guipre.btnnext.w, 40.1, TS);
forlist(logdata_t *logdata, p->loginfo.full)
num += (logdata->from == selmap->levelnum);
Lith_GUI_ScrollBegin(g, &CBIState(g)->logscr, 15, 50, 280, 175, num * 8);
forlist(logdata_t *logdata, p->loginfo.full)
{
if(logdata->from != selmap->levelnum)
continue;
int y = 8 * i++;
if(Lith_GUI_ScrollOcclude(g, &CBIState(g)->logscr, y, 8))
continue;
DrawSpritePlain(":UI:LogList", g->hid--, g->ox + 0.1, y + g->oy + 0.1, TS);
HudMessageF("CBIFONT", "%S", logdata->info);
HudMessageParams(0, g->hid--, CR_GREEN, g->ox + 2.1, y + g->oy + 1.1, TS);
}
Lith_GUI_ScrollEnd(g, &CBIState(g)->logscr);
}
// EOF