Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
P
PyCommandCenter
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Requirements
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Test cases
Artifacts
Deploy
Releases
Package registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Code review analytics
Issue analytics
Insights
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Erik Ahlroth
PyCommandCenter
Commits
eb52cfbb
Commit
eb52cfbb
authored
6 years ago
by
David Bergström
Browse files
Options
Downloads
Patches
Plain Diff
Reimplement New TechTree
parent
c7ab9fd7
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
python-api-src/lib_unittype.cpp
+1
-0
1 addition, 0 deletions
python-api-src/lib_unittype.cpp
src/TechTreeImproved.cpp
+33
-38
33 additions, 38 deletions
src/TechTreeImproved.cpp
src/TechTreeImproved.h
+13
-5
13 additions, 5 deletions
src/TechTreeImproved.h
src/main.cpp
+1
-2
1 addition, 2 deletions
src/main.cpp
with
48 additions
and
45 deletions
python-api-src/lib_unittype.cpp
+
1
−
0
View file @
eb52cfbb
...
...
@@ -8,6 +8,7 @@ void define_unittype(py::module & m)
.
def
(
py
::
init
<
const
sc2
::
UnitTypeID
&
,
IDABot
&>
())
.
def
(
"is_type_id"
,
&
UnitType
::
is
,
"Check if UnitType is UnitTypeID"
)
.
def
(
py
::
self
==
py
::
self
)
.
def_property_readonly
(
"type_id"
,
&
UnitType
::
getAPIUnitType
)
.
def_property_readonly
(
"name"
,
&
UnitType
::
getName
)
.
def_property_readonly
(
"race"
,
&
UnitType
::
getRace
)
.
def_property_readonly
(
"is_valid"
,
&
UnitType
::
isValid
)
...
...
This diff is collapsed.
Click to expand it.
src/TechTreeImproved.cpp
+
33
−
38
View file @
eb52cfbb
...
...
@@ -14,14 +14,14 @@ std::string id_to_string(int id)
return
sc2
::
UnitTypeToName
(
static_cast
<
sc2
::
UNIT_TYPEID
>
(
id
));
}
void
add_requirement
(
json
&
requirement
,
BuildAlternative
&
alternative
)
void
add_requirement
(
BuildDescription
&
description
,
json
&
requirement
)
{
std
::
string
type
=
requirement
[
"type"
];
if
(
type
==
"and"
)
{
for
(
auto
&
subrequirement
:
requirement
[
"operands"
])
{
add_requirement
(
subrequirement
,
alternative
);
add_requirement
(
description
,
subrequirement
);
}
}
else
if
(
type
==
"unitCount"
)
...
...
@@ -31,7 +31,7 @@ void add_requirement(json & requirement, BuildAlternative & alternative)
for
(
auto
&
unit
:
requirement
[
"unit"
])
{
//std::cout << "Addon: " << sc2::UnitTypeToName(static_cast<sc2::UNIT_TYPEID>(unit)) << " (" << unit << ")" << std::endl;
alternative
.
addons_needed
.
push_back
(
static_cast
<
sc2
::
UNIT_TYPEID
>
(
unit
));
description
.
addons_needed
.
push_back
(
static_cast
<
sc2
::
UNIT_TYPEID
>
(
unit
));
}
}
else
if
(
requirement
[
"state"
]
==
"CompleteOnly"
)
...
...
@@ -39,7 +39,7 @@ void add_requirement(json & requirement, BuildAlternative & alternative)
for
(
auto
&
unit
:
requirement
[
"unit"
])
{
//std::cout << "Just building: " << sc2::UnitTypeToName(static_cast<sc2::UNIT_TYPEID>(unit)) << " (" << unit << ")" << std::endl;
alternative
.
buildings_needed
.
push_back
(
static_cast
<
sc2
::
UNIT_TYPEID
>
(
unit
));
description
.
buildings_needed
.
push_back
(
static_cast
<
sc2
::
UNIT_TYPEID
>
(
unit
));
}
}
else
...
...
@@ -50,39 +50,52 @@ void add_requirement(json & requirement, BuildAlternative & alternative)
}
}
BuildAlternative
parse_build_alternative
(
json
&
build_item
)
void
parse_build_description
(
BuildDescription
&
description
,
json
&
build_item
)
{
BuildAlternative
alternative
{
build_item
[
"unit"
]
}
;
description
.
resulting_type
=
build_item
[
"unit"
];
if
(
build_item
.
find
(
"requires"
)
!=
build_item
.
end
())
{
//std::cout << "Building unit: " << id_to_string(build_item["unit"]) << " requires" << std::endl;
auto
&
requires
=
build_item
[
"requires"
][
0
];
add_requirement
(
requires
,
alternative
);
add_requirement
(
description
,
requires
);
}
return
alternative
;
}
std
::
pair
<
sc2
::
UNIT_TYPEID
,
std
::
vector
<
BuildAlternative
>>
parse_unit
(
json
::
iterator
it
)
void
TechTreeImproved
::
parse_unit
(
json
::
iterator
it
)
{
sc2
::
UNIT_TYPEID
id
=
string_to_id
(
it
.
key
());
std
::
string
name
=
sc2
::
UnitTypeToName
(
id
);
std
::
vector
<
Build
Alternative
>
build_alternative
s
;
sc2
::
UNIT_TYPEID
producer_
id
=
string_to_id
(
it
.
key
());
//
std::string name = sc2::UnitTypeToName(
producer_
id);
std
::
vector
<
Build
Description
>
build_description
s
;
if
(
it
.
value
().
find
(
"builds"
)
!=
it
.
value
().
end
())
{
auto
&
builds
=
it
.
value
()[
"builds"
];
for
(
auto
&
build_item
:
builds
)
{
BuildAlternative
build_alternative
=
parse_build_alternative
(
build_item
);
build_alternatives
.
push_back
(
build_alternative
);
BuildDescription
description
;
description
.
producer_type
=
producer_id
;
parse_build_description
(
description
,
build_item
);
if
(
result_to_data
.
count
(
description
.
resulting_type
)
>
0
)
{
std
::
cout
<<
"Found more than one way to build "
<<
sc2
::
UnitTypeToName
(
description
.
resulting_type
)
<<
" ("
<<
(
unsigned
int
)
description
.
resulting_type
<<
")"
<<
std
::
endl
;
result_to_data
[
description
.
resulting_type
].
push_back
(
description
);
}
else
{
result_to_data
[
description
.
resulting_type
]
=
{
description
};
}
}
}
return
{
id
,
build_alternatives
};
producer_to_data
[
producer_id
]
=
build_descriptions
;
}
void
TechTreeImproved
::
LoadData
()
{
// TODO: Do not hardcode this. Use the latest json available.
// TODO: Check if file exists
std
::
ifstream
i
(
"techtree.json"
);
json
j
;
i
>>
j
;
...
...
@@ -91,39 +104,21 @@ void TechTreeImproved::LoadData() {
{
for
(
json
::
iterator
it
=
race
.
begin
();
it
!=
race
.
end
();
++
it
)
{
auto
pair
=
parse_unit
(
it
);
data
[
pair
.
first
]
=
pair
.
second
;
parse_unit
(
it
);
}
}
std
::
cout
<<
"Done"
<<
std
::
endl
;
}
const
std
::
vector
<
Build
Alternative
>
&
TechTreeImproved
::
GetBuildAlternatives
(
sc2
::
UNIT_TYPE
ID
unit
)
const
const
std
::
vector
<
Build
Description
>
&
TechTreeImproved
::
HowToBuild
(
sc2
::
UnitType
ID
unit
)
const
{
if
(
data
.
count
(
unit
)
>
0
)
sc2
::
UNIT_TYPEID
unit_id
=
static_cast
<
sc2
::
UNIT_TYPEID
>
(
unit
);
if
(
result_to_data
.
count
(
unit
)
>
0
)
{
return
data
.
at
(
unit
);
return
result_to_
data
.
at
(
unit
);
}
else
{
std
::
cout
<<
"No information about unit type "
<<
sc2
::
UnitTypeToName
(
unit
)
<<
" ("
<<
static_cast
<
int
>
(
unit
)
<<
")"
<<
std
::
endl
;
return
{};
}
}
std
::
vector
<
std
::
pair
<
sc2
::
UNIT_TYPEID
,
BuildAlternative
>>
TechTreeImproved
::
HowToBuild
(
sc2
::
UNIT_TYPEID
unit_type
)
{
std
::
vector
<
std
::
pair
<
sc2
::
UNIT_TYPEID
,
BuildAlternative
>>
alternatives
;
for
(
auto
&
pair
:
data
)
{
for
(
const
BuildAlternative
&
alternative
:
pair
.
second
)
{
if
(
alternative
.
type
==
unit_type
)
{
alternatives
.
push_back
({
pair
.
first
,
alternative
});
}
}
}
return
alternatives
;
}
\ No newline at end of file
This diff is collapsed.
Click to expand it.
src/TechTreeImproved.h
+
13
−
5
View file @
eb52cfbb
...
...
@@ -8,19 +8,27 @@
#include
"sc2api/sc2_typeenums.h"
struct
Build
Alternative
struct
Build
Description
{
sc2
::
UNIT_TYPEID
type
;
sc2
::
UNIT_TYPEID
producer_type
;
sc2
::
UNIT_TYPEID
resulting_type
;
sc2
::
AbilityID
ability_used
;
float
time
;
std
::
vector
<
sc2
::
UNIT_TYPEID
>
buildings_needed
;
std
::
vector
<
sc2
::
UNIT_TYPEID
>
addons_needed
;
};
class
TechTreeImproved
{
std
::
map
<
sc2
::
UNIT_TYPEID
,
std
::
vector
<
BuildAlternative
>>
data
;
std
::
vector
<
BuildDescription
>
data
;
std
::
map
<
sc2
::
UNIT_TYPEID
,
std
::
vector
<
BuildDescription
>>
producer_to_data
;
std
::
map
<
sc2
::
UNIT_TYPEID
,
std
::
vector
<
BuildDescription
>>
result_to_data
;
void
parse_unit
(
nlohmann
::
json
::
iterator
it
);
public:
TechTreeImproved
();
void
LoadData
();
const
std
::
vector
<
BuildAlternative
>
&
GetBuildAlternatives
(
sc2
::
UNIT_TYPEID
)
const
;
std
::
vector
<
std
::
pair
<
sc2
::
UNIT_TYPEID
,
BuildAlternative
>>
TechTreeImproved
::
HowToBuild
(
sc2
::
U
NIT_TYPE
ID
unit
);
// Given a unit, how can we build it?
const
std
::
vector
<
BuildDescription
>
&
HowToBuild
(
sc2
::
U
nitType
ID
unit
)
const
;
};
\ No newline at end of file
This diff is collapsed.
Click to expand it.
src/main.cpp
+
1
−
2
View file @
eb52cfbb
...
...
@@ -12,8 +12,7 @@ int main(int argc, char* argv[])
TechTreeImproved
tree
;
tree
.
LoadData
();
std
::
vector
<
BuildAlternative
>
alts
=
tree
.
GetBuildAlternatives
(
sc2
::
UNIT_TYPEID
::
TERRAN_BARRACKS
);
std
::
vector
<
std
::
pair
<
sc2
::
UNIT_TYPEID
,
BuildAlternative
>>
alts2
=
tree
.
HowToBuild
(
sc2
::
UNIT_TYPEID
::
TERRAN_GHOST
);
std
::
vector
<
BuildDescription
>
alts
=
tree
.
HowToBuild
(
sc2
::
UNIT_TYPEID
::
TERRAN_GHOST
);
return
0
;
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment