Skip to content

Commit

Permalink
[SmartScripts] Propertly saving and loading WAIT action
Browse files Browse the repository at this point in the history
  • Loading branch information
BAndysc committed Jan 11, 2021
1 parent 57ee4de commit e6f8580
Show file tree
Hide file tree
Showing 7 changed files with 200 additions and 128 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@
</Style>
</ItemsControl.ItemContainerStyle>
</ItemsControl>
<Canvas Background="Transparent">
<Canvas Background="Transparent" MinHeight="30">
<b:Interaction.Triggers>
<b:EventTrigger EventName="MouseDown">
<b:InvokeCommandAction Command="{Binding DeselectAll}"/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -282,7 +282,7 @@ public SmartScriptEditorViewModel(IHistoryManager history,
var selectedActions = Events.SelectMany(e => e.Actions).Where(e => e.IsSelected).ToList();
if (selectedActions.Count > 0)
{
var fakeEvent = new SmartEvent(-1);
var fakeEvent = new SmartEvent(-1){ReadableHint = ""};
foreach (var a in selectedActions)
fakeEvent.AddAction(a.Copy());
var lines = string.Join("\n", fakeEvent.ToSmartScriptLines(script.EntryOrGuid, script.SourceType, 0).Select(s => s.ToSqlString()));
Expand Down Expand Up @@ -528,28 +528,8 @@ internal void SetSolutionItem(SmartScriptSolutionItem item)
private async Task SaveAllToDb()
{
statusbar.PublishNotification(new PlainNotification(NotificationType.Info, "Saving to database"));
List<AbstractSmartScriptLine> lines = new List<AbstractSmartScriptLine>();

int eventId = 1;

foreach (SmartEvent e in script.Events)
{
if (e.Actions.Count == 0)
continue;

e.ActualId = eventId;
lines.Add(GenerateSingleSai(eventId, e, e.Actions[0], (e.Actions.Count == 1 ? 0 : eventId + 1)));

eventId++;

for (int index = 1; index < e.Actions.Count; ++index)
{
lines.Add(GenerateSingleSai(eventId, smartFactory.EventFactory(61),
e.Actions[index], (e.Actions.Count - 1 == index ? 0 : eventId + 1)));
eventId++;
}
}

var lines = script.ToWaitFreeSmartScriptLines(smartFactory);
await database.InstallScriptFor(_item.Entry, _item.SmartType, lines);

statusbar.PublishNotification(new PlainNotification(NotificationType.Success, "Saved to database"));
Expand Down
144 changes: 46 additions & 98 deletions WDE.SmartScriptEditor/Exporter/SmartScriptExporter.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
Expand Down Expand Up @@ -47,115 +48,62 @@ private void BuildInsert()
_sql.AppendLine(
"INSERT INTO smart_scripts (entryorguid, source_type, id, link, event_type, event_phase_mask, event_chance, event_flags, event_param1, event_param2, event_param3, event_param4, action_type, action_param1, action_param2, action_param3, action_param4, action_param5, action_param6, target_type, target_param1, target_param2, target_param3, target_x, target_y, target_z, target_o, comment) VALUES");

int eventId = 0;
List<string> lines = new List<string>();

bool previousWasWait = false;
int nextTriggerId = 1000;


//@todo: don't use hardcoded IDs!!!!
foreach (SmartEvent e in _script.Events)
{
if (e.Actions.Count == 0)
continue;

e.ActualId = eventId;

for (int index = 0; index < e.Actions.Count; ++index)
{
SmartEvent actualEvent = e;

if (previousWasWait)
{
actualEvent = smartFactory.EventFactory(59);
actualEvent.SetParameter(0, nextTriggerId++);
}
else if (index > 0)
actualEvent = smartFactory.EventFactory(61);

int linkTo = (e.Actions.Count - 1 == index ? 0 : eventId + 1);

SmartAction actualAction = e.Actions[index];

if (actualAction.Id == 9999)
{
linkTo = 0;
SmartAction waitAction = actualAction;
actualAction = smartFactory.ActionFactory(67, smartFactory.SourceFactory(0), smartFactory.TargetFactory(0));
actualAction.SetParameter(0, nextTriggerId);
actualAction.SetParameter(1, waitAction.GetParameter(0).GetValue());
actualAction.SetParameter(2, waitAction.GetParameter(0).GetValue());

previousWasWait = true;
}
else
previousWasWait = false;

lines.Add(GenerateSingleSai(eventId, actualEvent, actualAction, linkTo));

eventId++;
}
}
var serializedScript = _script.ToWaitFreeSmartScriptLines(smartFactory);
IEnumerable<string> lines = serializedScript.Select(GenerateSingleSai);

_sql.Append(string.Join(",\n", lines));
_sql.AppendLine(";");
}

private string GenerateSingleSai(int eventId, SmartEvent ev, SmartAction action, int link = 0, string comment = null)
private string GenerateSingleSai(ISmartScriptLine line)
{
System.Globalization.CultureInfo customCulture = (System.Globalization.CultureInfo)System.Threading.Thread.CurrentThread.CurrentCulture.Clone();
customCulture.NumberFormat.NumberDecimalSeparator = ".";

System.Threading.Thread.CurrentThread.CurrentCulture = customCulture;

//if (action.Id == 188) // ACTION DEBUG MESSAGE
// comment = action.Comment;
object data = new
{
entryorguid = "@ENTRY",
source_type = ((int)_script.SourceType).ToString(),
id = eventId.ToString(),
linkto = link.ToString(),

event_id = ev.Id.ToString(),
phasemask = ev.Phases.GetValue().ToString(),
chance = ev.Chance.ToString(),
flags = ev.Flags.GetValue().ToString(),
event_param1 = ev.GetParameter(0).GetValue().ToString(),
event_param2 = ev.GetParameter(1).GetValue().ToString(),
event_param3 = ev.GetParameter(2).GetValue().ToString(),
event_param4 = ev.GetParameter(3).GetValue().ToString(),

event_cooldown_min = ev.CooldownMin.GetValue().ToString(),
event_cooldown_max = ev.CooldownMax.GetValue().ToString(),

action_id = action.Id.ToString(),
action_param1 = action.GetParameter(0).GetValue().ToString(),
action_param2 = action.GetParameter(1).GetValue().ToString(),
action_param3 = action.GetParameter(2).GetValue().ToString(),
action_param4 = action.GetParameter(3).GetValue().ToString(),
action_param5 = action.GetParameter(4).GetValue().ToString(),
action_param6 = action.GetParameter(5).GetValue().ToString(),

action_source_id = action.Source.Id.ToString(),
source_param1 = action.Source.GetParameter(0).GetValue().ToString(),
source_param2 = action.Source.GetParameter(1).GetValue().ToString(),
source_param3 = action.Source.GetParameter(2).GetValue().ToString(),
source_condition_id = action.Source.Condition.GetValue().ToString(),

target_id = action.Target.Id.ToString(),
target_param1 = action.Target.GetParameter(0).GetValue().ToString(),
target_param2 = action.Target.GetParameter(1).GetValue().ToString(),
target_param3 = action.Target.GetParameter(2).GetValue().ToString(),
target_condition_id = action.Target.Condition.GetValue().ToString(),


x = action.Target.X.ToString(),
y = action.Target.X.ToString(),
z = action.Target.X.ToString(),
o = action.Target.X.ToString(),

comment = comment ?? (ev.Readable + " - " + action.Readable)
id = line.Id.ToString(),
linkto = line.Link.ToString(),

event_id = line.EventType.ToString(),
phasemask = line.EventPhaseMask.ToString(),
chance = line.EventChance.ToString(),
flags = line.EventFlags.ToString(),
event_param1 = line.EventParam1.ToString(),
event_param2 = line.EventParam2.ToString(),
event_param3 = line.EventParam3.ToString(),
event_param4 = line.EventParam4.ToString(),

event_cooldown_min = line.EventCooldownMin.ToString(),
event_cooldown_max = line.EventCooldownMax.ToString(),

action_id = line.ActionType.ToString(),
action_param1 = line.ActionParam1.ToString(),
action_param2 = line.ActionParam2.ToString(),
action_param3 = line.ActionParam3.ToString(),
action_param4 = line.ActionParam4.ToString(),
action_param5 = line.ActionParam5.ToString(),
action_param6 = line.ActionParam6.ToString(),

action_source_id = line.SourceType.ToString(),
source_param1 = line.SourceParam1.ToString(),
source_param2 = line.SourceParam2.ToString(),
source_param3 = line.SourceParam3.ToString(),
source_condition_id = line.SourceConditionId.ToString(),

target_id = line.TargetType.ToString(),
target_param1 = line.TargetParam1.ToString(),
target_param2 = line.TargetParam2.ToString(),
target_param3 = line.TargetParam3.ToString(),
target_condition_id = line.TargetConditionId.ToString(),

x = line.TargetX.ToString(CultureInfo.InvariantCulture),
y = line.TargetY.ToString(CultureInfo.InvariantCulture),
z = line.TargetZ.ToString(CultureInfo.InvariantCulture),
o = line.TargetO.ToString(CultureInfo.InvariantCulture),

comment = line.Comment
};

return SmartFormat.Smart.Format(SAI_SQL, data);
Expand Down
84 changes: 78 additions & 6 deletions WDE.SmartScriptEditor/Exporter/SmartScriptSerializer.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text.RegularExpressions;
using WDE.Common.Database;
using WDE.SmartScriptEditor.Data;
using WDE.SmartScriptEditor.Models;

namespace WDE.SmartScriptEditor.Exporter
Expand Down Expand Up @@ -104,13 +107,82 @@ public static string ToSqlString(this ISmartScriptLine line)

return SmartFormat.Smart.Format(SAI_SQL, data);
}

public static ISmartScriptLine[] ToSmartScriptLines(this SmartEvent e, int scriptEntryOrGuid, SmartScriptType scriptSourceType, int id)

public static ISmartScriptLine[] ToWaitFreeSmartScriptLines(this SmartScript script, ISmartFactory smartFactory)
{
if (script.Events.Count == 0)
return new ISmartScriptLine[0];

int eventId = 0;
List<ISmartScriptLine> lines = new List<ISmartScriptLine>();
bool previousWasWait = false;
int nextTriggerId = script.Events.Where(e => e.Id == SmartConstants.EVENT_TRIGGER_TIMED).Select(e => e.GetParameter(0).Value).DefaultIfEmpty(0).Max() + 1;

//@todo: don't use hardcoded IDs!!!!
foreach (SmartEvent e in script.Events)
{
if (e.Actions.Count == 0)
continue;

e.ActualId = eventId;

for (int index = 0; index < e.Actions.Count; ++index)
{
SmartEvent actualEvent = e;

if (previousWasWait)
{
actualEvent = smartFactory.EventFactory(SmartConstants.EVENT_TRIGGER_TIMED);
actualEvent.SetParameter(0, nextTriggerId++);
}
else if (index > 0)
actualEvent = smartFactory.EventFactory(SmartConstants.EVENT_LINK);

int linkTo = (e.Actions.Count - 1 == index ? 0 : eventId + 1);

SmartAction actualAction = e.Actions[index];

if (actualAction.Id == SmartConstants.ACTION_WAIT)
{
linkTo = 0;
SmartAction waitAction = actualAction;
actualAction = smartFactory.ActionFactory(SmartConstants.ACTION_TRIGGER_TIMED, smartFactory.SourceFactory(SmartConstants.SOURCE_NONE), smartFactory.TargetFactory(SmartConstants.TARGET_NONE));
actualAction.SetParameter(0, nextTriggerId);
actualAction.SetParameter(1, waitAction.GetParameter(0).GetValue());
actualAction.SetParameter(2, waitAction.GetParameter(0).GetValue());
actualAction.Comment = SmartConstants.COMMENT_WAIT;
previousWasWait = true;
}
else
previousWasWait = false;

SmartEvent eventToSerialize = actualEvent.ShallowCopy();
eventToSerialize.Actions.Add(actualAction.Copy());

var serialized =
eventToSerialize.ToSmartScriptLines(script.EntryOrGuid, script.SourceType, eventId, linkTo);

if (serialized.Length != 1)
throw new InvalidOperationException();

lines.Add(serialized[0]);

eventId++;
}
}

return lines.ToArray();
}

public static ISmartScriptLine[] ToSmartScriptLines(this SmartEvent e, int scriptEntryOrGuid, SmartScriptType scriptSourceType, int id, int? linkTo = null)
{
List<ISmartScriptLine> lines = new List<ISmartScriptLine>();
IEnumerable<SmartAction> actions = e.Actions.Count == 0 ? new List<SmartAction>()
{
new SmartAction(-1, new SmartSource(-1), new SmartTarget(-1))
new SmartAction(-1, new SmartSource(-1){ReadableHint = ""}, new SmartTarget(-1){ReadableHint = ""})
{
ReadableHint = ""
}
} : e.Actions;

foreach (var a in actions)
Expand All @@ -120,7 +192,7 @@ public static ISmartScriptLine[] ToSmartScriptLines(this SmartEvent e, int scrip
EntryOrGuid = scriptEntryOrGuid,
ScriptSourceType = (int)scriptSourceType,
Id = id,
Link = 0,
Link = linkTo ?? 0,
EventType = e.Id,
EventPhaseMask = e.Phases.Value,
EventChance = e.Chance.Value,
Expand Down Expand Up @@ -152,7 +224,7 @@ public static ISmartScriptLine[] ToSmartScriptLines(this SmartEvent e, int scrip
TargetY = a.Target.Y,
TargetZ = a.Target.Z,
TargetO = a.Target.O,
Comment = "",
Comment = e.Readable + " - " + a.Readable + (string.IsNullOrEmpty(a.Comment) ? "" : (" // " + a.Comment)),
};
lines.Add(line);
}
Expand Down
12 changes: 12 additions & 0 deletions WDE.SmartScriptEditor/Models/SmartAction.cs
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,17 @@ public bool IsSelected
OnPropertyChanged();
}
}

private string _comment;
public string Comment
{
get => _comment;
set
{
_comment = value;
OnPropertyChanged();
}
}

private void SourceOnOnChanged(object? sender, EventArgs e)
{
Expand Down Expand Up @@ -131,6 +142,7 @@ public override string Readable
public SmartAction Copy()
{
SmartAction se = new SmartAction(Id, Source.Copy(), Target.Copy());
se.Comment = Comment;
se.ReadableHint = ReadableHint;
se.DescriptionRules = DescriptionRules;
for (int i = 0; i < ParametersCount; ++i)
Expand Down
14 changes: 14 additions & 0 deletions WDE.SmartScriptEditor/Models/SmartConstants.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
namespace WDE.SmartScriptEditor.Models
{
// this is bad we use hardcoded constants here :/
public static class SmartConstants
{
public const int SOURCE_NONE = 0;
public const int TARGET_NONE = 0;
public const int EVENT_TRIGGER_TIMED = 59;
public const int EVENT_LINK = 61;
public const int ACTION_TRIGGER_TIMED = 67;
public const int ACTION_WAIT = 9999;
public const string COMMENT_WAIT = "-meta_wait";
}
}
Loading

0 comments on commit e6f8580

Please sign in to comment.