LifeRPG_v2.0/HUD.ahk
Jayvant Javier Pujara 4c3b03ed79 Tabbed project manager
2012-12-13 19:39:33 -05:00

355 lines
10 KiB
AutoHotkey

;~ ===============================================================================
; HUD and functions:
HUD_Color = 15384E
HUD_Trans = 200
HUD_Color2 = 48B1DF
HUD_Font = Electrolize
; Create a new independent Guis for the HUD
; Level Module:
LevelX = 80
LevelY = 45
LevelW = 450
LevelH = 80
Gui, HUD_Level:New
Gui, HUD_Level:+LastFound +AlwaysOnTop -Caption +ToolWindow
Gui, HUD_Level:Color, %HUD_Color%
;Gui, HUD_Level:Add, Picture, x0 y0 w400 h70 , Res\BG.png
Gui, HUD_Level:Font, S14 Q5 Bold, Electrolize
Gui, HUD_Level:Add, Progress, vHUD_Progress x12 y12 w425 h18 cWhite Background48B1DF
NameSize = 260
Gui, HUD_Level:Add, Text, vHUD_Name x12 y+1 w%NameSize% r1 c%HUD_Color2% BackgroundTrans, % ProfileGet("name")
Gui, HUD_Level:Font, s10
PointsSize := 424 - NameSize
Gui, HUD_Level:Add, Text, vHUD_Points x+1 w%PointsSize% Right cWhite BackgroundTrans,
Gui, HUD_Level:Font, s14
Gui, HUD_Level:Add, Text, vHUD_Text x12 y+7 w425 cWhite BackgroundTrans r1 ; Shows current level and temporarily shows new XP awards.
HUD_LevelText := "LEVEL "
HUD_LevelTitle :=
;Gui, HUD_Level:Color, 15384E
WinSet, Transparent, %HUD_Trans%
Winset, ExStyle, +0x20
Gui, HUD_Level:Show, x%LevelX% y%LevelY% w%LevelW% h%LevelH% NoActivate
Gui, HUD_Level:Hide
; Momentum Module:
Gui, HUD_Momentum:New
Gui, HUD_Momentum:+LastFound +AlwaysOnTop -Caption +ToolWindow
Gui, HUD_Momentum:Color, %HUD_Color%
Gui, HUD_Momentum:Font, S14 Q5 bold, Electrolize
Gui, HUD_Momentum:Add, Text, x9 y4 cWhite BackgroundTrans, MMT
MMTStart := ProfileGet("momentum")
Gui, HUD_Momentum:Add, Progress, vHUD_MomentumBar x+5 y8 w325 h13 cRed Background48B1DF, % MMTStart
Gui, HUD_Momentum:Add, Text, vHUD_MomentumPerc x388 y4 w59 cWhite BackgroundTrans Center, % MMTStart . "%"
WinSet, Transparent, %HUD_Trans%
Winset, ExStyle, +0x20
Gui, HUD_Momentum:Show, x80 y135 w450 h30 NoActivate
Gui, HUD_Momentum:Hide
; Money/Finances Module:
Gui, HUD_Finances:New
Gui, HUD_Finances:+LastFound +AlwaysOnTop -Caption +ToolWindow
Gui, HUD_Finances:Color, %HUD_Color%
Gui, HUD_Finances:Font, S14 Q5 bold, %HUD_Font%
Gui, HUD_Finances:Add, Text, x9 y4 cWhite BackgroundTrans, $2405
WinSet, Transparent, %HUD_Trans%
WinSet, ExStyle, +0x20
Gui, HUD_Finances:Show, % "x80 y" (A_ScreenHeight - 80) " h30"
;Gui, HUD_Finances:Hide
HUD_Refresh()
{
global
; HUD Update:
; name
; level + title
; points/threshold
; momentum bar
; progress bar!
GuiControl, HUD_Level:, HUD_Progress, % ProgressGet()
GuiControl, HUD_Level:, HUD_Name, % ProfileGet("name")
GuiControl, HUD_Level:, HUD_Text, % HUD_LevelText . LevelCheck() . " " . ProfileGet("title")
GuiControl, HUD_Level:, HUD_Points, % PointsCheck() . "/" . ThreshCheck()
MMTNow := ProfileGet("momentum")
GuiControl, HUD_Momentum:, HUD_MomentumBar, % MMTNow
GuiControl, HUD_Momentum:, HUD_MomentumPerc, % MMTNow . "%"
}
HUD_MouseOverHide(ByRef hX, ByRef hY, ByRef hW, ByRef hH)
{
global HUD_Trans
SetTimer, Mouse, 100
Mouse:
CoordMode, Mouse, Screen
MouseGetPos, x, y
;ToolTip, %GuiX% (%GuiW% + %GuiX%) `n %x% %y%
; if the mouse (x) is located horizontally in a greater position than the hud's X starting position
; and less than that x position plus the HUD's width
; and vertically (y) greater than the HUD's y position
; and lower than that y pos plus the HUD's height
; then hide the HUD.
if (((x >= hX && x <= (hX+hW))) && ((y >= hY) && (y <= (165)))) ; 80-530; 45-125 ; hY+hH+
{
Gui, HUD_Level:+LastFound
WinSet, Transparent, 0
WinSet, ExStyle, +0x20
Gui, HUD_Momentum:+LastFound
WinSet, Transparent, 0
WinSet, ExStyle, +0x20
}
else
{
Gui, HUD_Level:+LastFound
WinSet, Transparent, %HUD_Trans%
WinSet, AlwaysOnTop, On
Gui, HUD_Momentum:+LastFound
WinSet, Transparent, %HUD_Trans%
WinSet, AlwaysOnTop, On
}
return
}
HUD_Progress(PreviousLevelPoints="toggle",PreviousLevel="")
{
global
split = 0
;SetTimer, DestProg, Off
SetTimer, ClearAwardText, off
SetTimer, HideAgain, off
static VisibState = 0
Gui, HUD_Level:Default
if (VisibState = 1) ; HUD is visible
{
if (PreviousLevelPoints = "toggle") ; toggle called, so hide HUD and return
{
Gui, HUD_Level:Hide
Gui, HUD_Momentum:Hide
VisibState = 0 ; HUD now hidden
}
else ; update progress bar and then clear award text from control after a few seconds.
{
HUD_Update(PreviousLevelPoints, PreviousLevel)
SetTimer, ClearAwardText, 2000
return
ClearAwardText:
Critical
Gui, HUD_Level:Default
GuiControl, , HUD_Text, % HUD_LevelText . LevelCheck() . " " . ProfileGet("title")
SetTimer, ClearAwardText, off
return
}
}
else if (VisibState = 0) ; HUD is not visible
{
if (PreviousLevelPoints = "toggle") ; toggle called, so show HUD
{
GuiControl,, HUD_Progress, % ProgressGet() ; Update progress bar
GuiControl,, HUD_Text, % HUD_LevelText . LevelCheck() . " " . ProfileGet("title")
GuiControl,, HUD_Points, % PointsCheck() . "/" . ThreshCheck()
Gui, HUD_Level:Show, x80 y45 NoActivate
WinSet, AlwaysOnTop, On
Gui, HUD_Momentum:Show, NoActivate
WinSet, AlwaysOnTop, On
HUD_MouseOverHide(LevelX, LevelY, LevelW, LevelH)
VisibState = 1 ; HUD now showing
}
else ; show HUD temporarily when points are awarded, update progress bar and text, and then hide again.
{
Gui, HUD_Level:Show, x80 y45 NoActivate
WinSet, AlwaysOnTop, On
Gui, HUD_Momentum:Show, NoActivate
WinSet, AlwaysOnTop, On
HUD_Update(PreviousLevelPoints, PreviousLevel)
SetTimer, HideAgain, 2500
return
HideAgain:
Critical
Gui, HUD_Level:Hide
Gui, HUD_Momentum:Hide
SetTimer, HideAgain, off
return
}
}
return
}
; Animate the progress bars and numbers and check for leveling up event:
HUD_Update(PreviousLevelPoints, PreviousLevel)
{
global
Gui, HUD_Level:Default ; Operate on the Level module
CurrentLevelPoints := ProgressGet()
if (PreviousLevelPoints < CurrentLevelPoints)
{
; slide up to sub100 value CurrentLevelPoints
GuiControl,, HUD_Progress, % PreviousLevelPoints
if (CurrentLevelPoints >= 100)
{
split = 1
CurrentLevelPoints = 100
}
else
split = 0
AnimationCount := CurrentLevelPoints - PreviousLevelPoints
AnimPoints := PointsCheck() - AnimationCount
Loop % AnimationCount
{
GuiControl,, HUD_Progress, % PreviousLevelPoints + A_Index
;GuiControl,, HUD_Text, % HUD_LevelText . PreviousLevel . " +" . A_Index . " XP"
GuiControl,, HUD_Text, % HUD_LevelText . PreviousLevel . " +" . A_Index . " XP " . ProfileGet("title")
GuiControl,, HUD_Points, % AnimPoints + A_Index . "/" . ThreshCheck()
Sleep 50
}
if (split = 1)
{
GuiControl,, HUD_Progress, 0
NewLevelPoints := ProgressGet() - 100
Loop % NewLevelPoints
{
GuiControl,, HUD_Progress, % A_Index
;GuiControl,, HUD_Text, % HUD_LevelText . LevelCheck() . " +" . A_Index
GuiControl,, HUD_Text, % HUD_LevelText . LevelCheck() . " +" . A_Index . " XP " . ProfileGet("title")
GuiControl,, HUD_Points, % (PointsCheck()-NewLevelPoints) + A_Index . "/" . ThreshCheck()
Sleep 50
}
}
}
LevelCheck()
}
HUD_Message(message, duration="2500")
{
;Gui, 2:Destroy
Gui, Message:New
; Example: On-screen display (OSD) via transparent window:
CustomColor = 9AFF9A ; Can be any RGB color (it will be made transparent below).
Gui Message:+LastFound +AlwaysOnTop -Caption +ToolWindow ; +ToolWindow avoids a taskbar button and an alt-tab menu item.
Gui, Message:Color, %CustomColor%
Gui, Message:Font, s25 Q5, Electrolize ; Set a large font size (32-point).
Gui, Message:Add, Text, Center cLime, %message% ; XX & YY serve to auto-size the window.
; Make all pixels of this color transparent and make the text itself translucent (150):
WinSet, TransColor, %CustomColor% 255
;VertPos := A_ScreenHeight - offset
Gui, Message:Show, x60 y99 NoActivate ; NoActivate avoids deactivating the currently active window.
;Sleep 2000
SetTimer, DestroyMsg, %duration%
return
DestroyMsg:
Gui, Message:Destroy
SetTimer, DestroyMsg, Off
return
}
PointsCheck()
{
; The current number of points I have
global db
PointsSet := db.OpenRecordSet("SELECT value FROM profile WHERE setting = 'points'")
while (!PointsSet.EOF)
{
Points := PointsSet["value"]
PointsSet.MoveNext()
}
PointsSet.Close()
return Points
}
; Could combine these two functions into one ^ \/, plus the writing ones:
ThreshCheck()
{
; The next upcoming point threshold to level up again
global db
ThresholdSet := db.OpenRecordSet("SELECT value FROM profile WHERE setting = 'threshold'")
while (!ThresholdSet.EOF)
{
Threshold := ThresholdSet["value"]
ThresholdSet.MoveNext()
}
ThresholdSet.Close()
return Threshold
}
PointsWrite(Points)
{
;global PointsFile
;IniWrite, %Points%, %PointsFile%, Data, Points ; Store certain number of awarded points in file
global db
bool := db.Query("UPDATE profile SET value = " . Points . " WHERE setting = 'points'")
return
}
ThreshWrite(Threshold)
{
;global PointsFile
;IniWrite, %Threshold%, %PointsFile%, Data, Threshold
global db
bool := db.Query("UPDATE profile SET value = " . Threshold . " WHERE setting = 'threshold'")
return
}
ProgressGet() {
CurrentProgress := 100 - (ThreshCheck() - PointsCheck()) ; How many points until next level up event
return CurrentProgress ; What shows up on progress bar
}
LevelCheck() {
global LevelUpSound
; Threshold starts at 100, i.e. you start at level 1
If (PointsCheck() >= ThreshCheck())
{
;Set next threshold
;Threshold should go up.
if (FileExist(LevelUpSound))
SoundPlay, %LevelUpSound%
ThreshWrite(ThreshCheck() + 100) ; Write new threshold
LevelNow := Floor(ThreshCheck()/100)
;HUD_Message("Level Up! Level " LevelNow, 5000) ; This *could* be a fancier notification than just a tray notification
Notification("LEVEL UP!", "You have reached Level " . LevelNow)
}
Return Floor(ThreshCheck()/100)
}
LevelGet()
{
return Floor(ThreshCheck()/100)
}
; Main function to call to award points:
UpdateProgress(Message, Award, Sound="") ; Call to give user some points and show a notification
{
PreviousLevelPoints := ProgressGet()
PreviousLevel := LevelCheck()
;SoundPlay, %Sound%
;HUD_Message(Message) HUD_message should be altered to be a fancy HUD message
Notification(Message, "+" . Award . " XP Awarded")
PointsWrite(PointsCheck() + Award)
HUD_Progress(PreviousLevelPoints, PreviousLevel)
return
}
Notification(Title, Message="", Duration=9)
{
Notify(Title, Message, Duration, "GC=15384E GR=0 GT=200 TS=14 TC=ffffff TF=Electrolize MS=14 MC=48B1DF MF=Electrolize BW=0 BR=0")
return
}